您好我正在尝试根据插件扩展值动态创建和配置任务,问题似乎是评估顺序,有什么方法可以解决它吗?
apply plugin: SetupPlugin
setup {
destDir = 'some directory set per project in build.gradle'
sourceFile = 'some file set per project in build.gradle'
}
class PluginExtension {
String destDir
String sourceFile
}
class SetupPlugin implements Plugin<Project> {
def placeholders
void apply(Project project) {
project.extensions.create("setup", PluginExtension)
project.task ("setupEnvironment", type: Copy) {
doFirst() {
//computes placeholders <-- project.setup has value here
}
into (project.setup.destDir){ //<-- project.setup is null
from project.setup.sourceFile
}
filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: placeholders)
}
}
}
答案 0 :(得分:1)
将其移入doFirst块会导致一些副作用,因为gradle最新任务可能会遇到问题,因为在执行时重新配置复制任务的参数而不是配置时间。应该做的诀窍是使用闭包来推迟评估:
...
void apply(Project project) {
project.extensions.create("setup", PluginExtension)
project.task ("setupEnvironment", type: Copy) {
doFirst() {
//computes placeholders <-- project.setup has value here
}
into {project.setup.destDir}
from { project.setup.sourceFile }
filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: placeholders)
}
}
...
希望有所帮助!
欢呼声, 勒
答案 1 :(得分:0)
这是因为在应用设置设置之前调用了apply
。
适用于doFirst
,因为它在构建期间调用apply
。
也许你可以将你的副本包装成doLast
?
答案 2 :(得分:0)
事实证明我问了一个我认为与此非常相似的问题。我可能会错过一个微妙的区别,但如果有帮助:here it is.