我的插件中有以下代码:
@Override
void apply(Project project) {
project.extensions.create(EXTENSION,TestExtension)
project.task("task1") << {
println "Task 1"
println(project.mmm.test)
def extension = project.extensions.findByName(EXTENSION)
println(extension.test)
}
project.task("task2",type: TestTask) {
println "Task 2 "
def extension = project.extensions.findByName(EXTENSION)
// conventionMapping.test = {extension.test}
// println(project.extensions.findByName(EXTENSION).test)
// test = "test"
}
}
在任务1中,extension.test返回正确的值。但是在task2 extension.test中总是返回null。我做错了什么?有没有更好的方法将一些扩展值作为任务的输入传递?我在Mac上使用gradle 1.12和jdk 1.8。最诚挚的问候
编辑:正确的版本:
project.task("task2", type: TestTask) {
project.afterEvaluate {
def extension = project.extensions.findByName(EXTENSION)
println(project.extensions.findByName(EXTENSION).test)
test = project.extensions.findByName(EXTENSION).test
}
}
答案 0 :(得分:5)
task1
在配置时打印执行时的值(注意<<
),task2
(在评估apply plugin: ...
之后的其余构建脚本之前) )。这解释了为什么task1的println
按预期工作,而task2的println
没有。
但是,在执行时配置任务为时已晚。相反,插件需要推迟读取用户提供的值,直到配置阶段结束(在评估构建脚本之后,但在执行任何任务之前)。有几种技术可以做到这一点。其中一个更简单的方法是使用project.afterEvaluate { ... }
包装任何此类读取访问权限。