我想获得关于定义依赖于外部状态(即在引用插件的build.gradle中定义的插件任务)的最佳实践的反馈。我使用扩展对象和闭包来延迟访问这些设置,直到它们需要和可用。我也有兴趣分享任务之间的状态,例如将一个任务的输出配置为另一个任务的输入。依赖扩展对象的任务的Gradle插件最佳实践
该代码使用“project.afterEvaluate”定义通过扩展对象配置所需设置时的任务。这似乎比应该需要的更复杂。如果我将代码从“afterEvaluate”移出,它会得到compileFlag == null,这不是外部设置。如果代码再次被更改为使用< <或doLast语法,那么它将获得外部标志......但是它无法使用type:Exec和其他类似有用的类型。
我觉得我在某些方面与Gradle作斗争,这意味着我不了解如何更好地使用它。以下是我正在使用的简化伪代码。这有效,但我期待看看这可以简化,或者确实是最佳实践。此外,除非任务正在执行,否则不应抛出异常。
apply plugin: MyPlugin
class MyPluginExtension {
String compileFlag = null
}
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("myPluginConfig", MyPluginExtension)
project.afterEvaluate {
// Closure delays getting and checking flag until strictly needed
def compileFlag = {
if (project.myPluginConfig.compileFlag == null) {
throw new InvalidUserDataException(
"Must set compileFlag: myPluginConfig { compileFlag = '-flag' }")
}
return project.myPluginConfig.compileFlag
}
// Inputs for translateTask
def javaInputs = {
project.files(project.fileTree(
dir: project.projectDir, includes: ['**/*.java']))
}
// This is the output of the first task and input to the second
def translatedOutputs = {
project.files(javaInputs().collect { file ->
return file.path.replace('src/', 'build/dir/')
})
}
// Translates all java files into 'translatedOutputs'
project.tasks.create(name: 'translateTask', type:Exec) {
inputs.files javaInputs()
outputs.files translatedOutputs()
executable '/bin/echo'
inputs.files.each { file ->
args file.path
}
}
// Compiles 'translatedOutputs' to binary
project.tasks.create(name: 'compileTask', type:Exec, dependsOn: 'translateTask') {
inputs.files translatedOutputs()
outputs.file project.file(project.buildDir.path + '/compiledBinary')
executable '/bin/echo'
args compileFlag()
translatedOutputs().each { file ->
args file.path
}
}
}
}
}
感谢bigguy,这是非常有用的。什么是“project.with”,因为我看不到任何文档?另外,当它们本身依赖于扩展对象的值时,是否有办法处理InputFile(s)OutputFile(s)依赖项?你只是使用InputDir OutputDir而不是? 'singleFile'技巧很好。最后是否有类似于我可以从execute调用的project.sync(){}?我想在目标文件夹上添加一些理智测试,以便它只删除生成的代码而不是其他东西。也许只是过滤意外的文件扩展名? – brunobowden 2014-11-23 19:16:22
我在答案中增加了更多信息。一般来说,我会尽量远离包含任务配置的扩展类。这没什么不妥,但你必须自己做更多的连线。 – bigguy 2014-11-23 19:44:53
感谢您的帮助bigguy – brunobowden 2014-11-24 16:46:25