如何在执行任务时才需要系统属性?

时间:2018-03-01 09:59:16

标签: gradle

我有一个带有自定义测试任务的gradle脚本:

task integrationTest(type:Test) {
  jvmArgs '-DmyParam=' + System.getProperty('myParam')
}

如果缺少属性,我希望使用一条好消息使构建失败,但仅当我的任务将被执行时才会失败。我尝试添加

task integrationTest(type:Test) {
  if (!System.hasProperty('myParam')) throw new InvalidUserDataException("Missing property myParam")
  jvmArgs '-DmyParam=' + System.getProperty('myParam')
}

但即使integrationTest任务没有被调用,这也会失败。

如何仅在执行任务时检查此项,而不是在gradle启动时检查?

2 个答案:

答案 0 :(得分:1)

您可以简单地使用doFirst关闭。关闭将在任务操作之前执行,因此足够早地修改任务,但不能在配置阶段,但在执行阶段期间,所以,只有执行任务:

task integrationTest(type:Test) {
    doFirst {
        jvmArgs '-DmyParam=' + System.getProperty('myParam')
    }
}

请注意,您可以使用systemProperty方法定义系统属性:

systemProperty 'myParam', System.getProperty('myParam')
// instead of
jvmArgs '-DmyParam=' + System.getProperty('myParam')

答案 1 :(得分:0)

一位同事帮助我找到答案。将异常移动到doFirst块将产生所需的结果:

task integrationTest(type:Test) {
    doFirst {
        if (!System.hasProperty('myParam')) throw new InvalidUserDataException("Missing property myParam")
    }
    jvmArgs '-DmyParam=' + System.getProperty('myParam')
}

或者,如果您需要在执行任务之前使构建失败,您可以检查是否将调用该任务:

project.gradle.taskGraph.whenReady { 
  if(project.gradle.taskGraph.hasTask(":integrationTest")) {
    if (!System.hasProperty('myParam')) throw new InvalidUserDataException("Missing property myParam")
   }
}