Gradle:为什么Exec派生的任务看不到自定义项目属性?

时间:2015-10-29 01:40:17

标签: groovy gradle

说,我们在build.gradle中设置了以下属性:

ext.PING = "PONG"

现在我们创建任务:

 task ping(type: Exec) {
     commandLine 'echo', project.hasProperty('PING')
 }

 task pong() {
        doLast {
            println project.hasProperty('PING')
        }   
    } 

如果将gradle pong运行,我们会看到true打印出来,如果我们运行gradle ping,我们就会赢。

问题是:在我们组建commandLine命令的那一刻,我们如何解决这些问题呢?问题是在doLastdoFirst中我们会看到已评估的属性,但这没有帮助 - 应该早先形成commandLine。

1 个答案:

答案 0 :(得分:1)

由于命令行参数的形成发生在配置阶段,您必须检查ext.PING = "PONG"是否在ping任务之前。例如,我用简单的构建脚本测试了它,如:

ext.PING = "PONG"
task ping(type: Exec) {
    commandLine 'echo', project.hasProperty('PING')
}

回声的结果是真的,但是对于:

task ping(type: Exec) {
    commandLine 'echo', project.hasProperty('PING')
}
ext.PING = "PONG"

结果是错误的。

您必须检查,是否在ping任务配置之前设置了此属性。对于doFirstdoLast,它们在执行阶段执行,这意味着所有配置都已完成且属性存在。