-. , , , . -, "" , ?
SourceSets . , . JVM .
Exec @TaskAction, ( project.exec {}). @Input, @InputFiles .. @OutputFiles, @OutputDirectory .. / ( , , ).
, , , compileFlag , ( ).
, Groovy.with method.
( , -), , . ( , src/something.java), /, - -, "" ( - ). , "" . , compileFlag ( , ).
TransactTask (, , ). , , . , .
apply plugin: 'base'
apply plugin: MyPlugin
class MyTranslateTask extends DefaultTask {
@InputFiles FileCollection srcFiles
@OutputDirectory File translatedDir
@TaskAction
public void translate() {
project.copy {
includeEmptyDirs = false
from(srcFiles)
into(translatedDir)
rename '(.+).java', '$1.m'
}
}
}
class MyCompileTask extends DefaultTask {
@Input String compileFlag
@InputFiles FileCollection translatedFiles
@OutputDirectory File outputDir
@TaskAction
public void compile() {
project.file("$outputDir/executable") << "${project.myPluginConfig.toolHome} $compileFlag ${translatedFiles.collect { it.path }}"
}
}
class MyPluginExtension {
File toolHome = new File("/some/sane/default")
}
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.with {
extensions.create("myPluginConfig", MyPluginExtension)
tasks.create(name: 'translateTask', type: MyTranslateTask) {
description = "Translates all java files into translatedDir"
srcFiles = fileTree(dir: projectDir, includes: [ '**/*.java' ])
translatedDir = file("${buildDir}/dir")
}
tasks.create(name: 'compileTask', type: MyCompileTask) {
description = "Compiles translated files into outputDir"
translatedFiles = fileTree(tasks.translateTask.outputs.files.singleFile) {
includes [ '**/*.m' ]
builtBy tasks.translateTask
}
outputDir = file("${buildDir}/compiledBinary")
}
}
}
}
myPluginConfig {
toolHome = file("/some/custom/path")
}
compileTask {
compileFlag = '-flag'
}