plugins { id 'base' id 'java' id 'com.github.node-gradle.node' version '7.0.1' } tasks.build.dependsOn 'assemble' node { version = '20.9.0' download = true } allprojects { apply plugin: 'java' repositories { mavenCentral() } project.ext.distVersion = { -> def json = new groovy.json.JsonSlurper() def packageData = json.parse(file("${rootProject.projectDir}/package.json")) return packageData.version; } project.ext.antvilleBuildDir = "${rootProject.buildDir}/tmp/antville" project.ext.antvilleInstallDir = "${rootProject.buildDir}/install/antville" project.ext.antvilleDistFiles = copySpec { from fileTree(antvilleBuildDir).matching {} } // Hide some purely Java-related tasks project.tasks.buildDependents.group = null; project.tasks.buildNeeded.group = null; project.tasks.classes.group = null; project.tasks.jar.group = null; project.tasks.javadoc.group = null; project.tasks.testClasses.group = null; } version = distVersion() dependencies { implementation 'org.commonmark:commonmark:0.24.0' implementation 'org.commonmark:commonmark-ext-autolink:0.24.0' implementation 'org.commonmark:commonmark-ext-gfm-strikethrough:0.24.0' implementation 'org.commonmark:commonmark-ext-gfm-tables:0.24.0' implementation 'org.jsoup:jsoup:1.17.2' implementation 'rome:rome:1.0' implementation('org.lesscss:lesscss:1.7.0.1.1') { exclude group: 'org.mozilla', module: 'rhino' exclude group: 'org.slf4j', module: 'slf4j-api' exclude group: 'org.slf4j', module: 'slf4j-simple' } } assemble { dependsOn 'installAntville' dependsOn 'installJars' dependsOn 'buildStaticFiles' doFirst { copy { from fileTree(antvilleBuildDir).matching { exclude 'node_modules' exclude 'package.json' exclude 'tests' exclude 'tools/client' exclude 'tools/antclick' exclude 'package-lock.json' } into antvilleInstallDir } } } tasks.register('installAntville') { description 'Clone the Antville repository and remove all unnecessary files.' group 'installation' outputs.dirs antvilleBuildDir doLast { def date = new Date().format('d MMM yyyy') def gitOutput = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-parse', '--short', 'HEAD' standardOutput = gitOutput errorOutput = new ByteArrayOutputStream() ignoreExitValue = true } def tag = gitOutput.toString().trim() copy { from "${project.projectDir}/code/app.properties" into "$antvilleBuildDir/code" filter { line -> line.replaceAll('(version =) 0.0.0', "\$1 $version.$tag") .replaceAll('(buildDate =) 18 Jun 2001', "\$1 $date") } } copy { from fileTree(project.projectDir).matching { include 'claustra/**' include 'code/**' exclude 'code/app.properties' include 'compat/**' include 'db/**' include 'i18n/**' exclude 'i18n/*.po*' include 'static/**' include 'tools/**' include 'CHANGES.md' include 'INSTALL.md' include 'README.md' } into antvilleBuildDir } } } tasks.register('installJars', Copy) { description 'Download required JAR libraries.' group 'installation' dependsOn 'installAntville' def outputDir = "$antvilleBuildDir/lib" outputs.dir outputDir from configurations.runtimeClasspath into outputDir } tasks.register('installNodeModules', NpmTask) { description 'Download required Node modules.' group 'build' dependsOn 'installAntville' inputs.files "${project.projectDir}/package-lock.json" outputs.dir "${project.projectDir}/node_modules" args = ['--silent', 'install'] execOverrides { it.workingDir = antvilleBuildDir } } tasks.register('buildStaticFiles', Copy) { description 'Build fonts, client-side scripts and stylesheets.' group 'build' dependsOn 'installAntville' dependsOn 'installNodeModules' dependsOn 'buildMainScript' dependsOn 'buildMainStyles' dependsOn 'buildEditorScript' dependsOn 'buildEditorStyles' dependsOn 'buildGalleryScript' dependsOn 'buildLicenses' def inputDir = "${project.projectDir}/node_modules/uikit/dist/fonts" def outputDir = "$antvilleBuildDir/static/fonts" inputs.dir inputDir outputs.dir outputDir from inputDir into outputDir } ['main', 'editor', 'gallery'].each { name -> tasks.register("build${name.capitalize()}Script", NpmTask) { description "Build the ${name} client-side scripts." group 'build' dependsOn 'installNodeModules' def inputFile = "${project.projectDir}/tools/client/${name}.js" def outputFile = "$antvilleBuildDir/static/scripts/${name}.min.js" inputs.files inputFile outputs.files outputFile args = [ '--silent', 'exec', '--', 'browserify', inputFile, '--outfile', outputFile, '-g', 'uglifyify' ] } } ['main', 'editor'].each { name -> tasks.register("build${name.capitalize()}Styles", NpmTask) { description "Build the ${name} stylesheet." group 'build' dependsOn 'installNodeModules' def inputFile = "${project.projectDir}/tools/client/${name}.less" def outputFile = "$antvilleBuildDir/static/styles/${name}.min.css" inputs.files inputFile outputs.files outputFile args = [ '--silent', 'exec', '--', 'lessc', '--clean-css', inputFile, outputFile ] } } tasks.register('buildLicenses', NpmTask) { description 'Build licenses file from client-side dependencies.' group 'build' dependsOn 'installNodeModules' def outputFile = "$antvilleBuildDir/static/licenses.txt" inputs.file "${project.projectDir}/package-lock.json" outputs.file outputFile args = [ '--silent', 'exec', '--', 'generate-license-file', '--input', "${project.projectDir}/package.json", '--output', outputFile, '--overwrite', '--eol', 'lf' ] execOverrides { it.workingDir = antvilleBuildDir it.standardOutput = new FileOutputStream(outputFile) } } tasks.register('jsdoc', NpmTask) { description 'Generates JavaScript API documentation for the main source code.' group 'documentation' dependsOn 'installNodeModules' def inputDir = "$antvilleBuildDir/code" def outputDir = "${project.buildDir}/docs/jsdoc" inputs.dir inputDir outputs.dir outputDir args = [ '--silent', 'exec', '--', 'jsdoc', '--recurse', '--destination', outputDir, inputDir ] execOverrides { it.workingDir = antvilleBuildDir } } tasks.register('assembleDist') { description 'Creates the Antville download packages.' group 'distribution' dependsOn 'assemble' dependsOn 'distZip' dependsOn 'distTar' } tasks.register('distZip', Zip) { description 'Creates the Antville download package as Zip file.' group 'distribution' dependsOn 'assemble' def version = project.distVersion() def outputDir = "${project.buildDir}/distributions" def outputFile = "antville-${version}.zip" inputs.dir antvilleInstallDir outputs.file "$outputDir/$outputFile" from antvilleInstallDir destinationDirectory = file(outputDir) archiveFileName = outputFile } tasks.register('distTar', Tar) { description 'Creates the Antville download package as Bzip2 file.' group 'distribution' dependsOn 'assemble' def version = project.distVersion() def outputDir = "${project.buildDir}/distributions" def outputFile = "antville-${version}.tbz" inputs.dir antvilleInstallDir outputs.file "$outputDir/$outputFile" from antvilleInstallDir compression = Compression.BZIP2 destinationDirectory = file(outputDir) archiveFileName = outputFile }