我会以另一种方式看待这个问题。看起来您想要放入扩展中的内容实际上是由您的每个任务所拥有的。如果您有“全局”插件配置选项,它是否一定会被视为输入?
另一种方法是使用您自己的 SourceSet 并将它们连接到您的自定义任务中。 IMO,这还不够容易。我们仍在将 JVM 和源的本机表示结合在一起。
我建议使用 @TaskAction 将 Exec 任务提取为自定义任务,该 @TaskAction 可以完成繁重的工作(即使它只是调用 project.exec {})。然后,您可以使用 @Input、@InputFiles 等注释您的输入,并使用 @OutputFiles、@OutputDirectory 等注释您的输出。这些注释将有助于自动连接您的依赖项和输入/输出(我认为这就是一些战斗即将到来的地方)从)。
您缺少的另一件事是,如果compileFlag影响最终输出,您需要检测它的更改并强制重建(但不是重新翻译)。
我通过使用简化了插件类的主体Groovy .with 方法。 http://mrhaki.blogspot.com/2009/09/groovy-goodness-with-method.html
我对此并不完全满意(我认为翻译的文件可以以不同的方式完成),但我希望它向您展示一些最佳实践。我通过将翻译实现为复制/重命名并将编译实现为仅创建“可执行”文件(内容只是输入列表),将其作为一个工作示例(只要您有 src/something.java) )。我还保留了您的扩展类来演示“全局”插件配置。还要看看compileFlag 未设置时会发生什么(我希望错误能好一点)。
TranslateTask 不会是增量的(尽管我认为你也许可以找到一种方法来做到这一点 http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.incremental.IncrementalTaskInputs.html)。因此,您可能每次都需要删除输出目录。如果您想保持简单,我不会将其他输出混合到该目录中。
HTH
apply plugin: 'base'
apply plugin: MyPlugin
class MyTranslateTask extends DefaultTask {
@InputFiles FileCollection srcFiles
@OutputDirectory File translatedDir
@TaskAction
public void translate() {
// println "toolhome is ${project.myPluginConfig.toolHome}"
// translate java files by renaming them
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() {
// write inputs to the executable file
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'
}