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

问题描述 投票:0回答:2

我有一个带有自定义测试任务的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启动时检查?

gradle
2个回答
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')

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")
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.