Gradle 任务检查是不是定义了属性

Posted

技术标签:

【中文标题】Gradle 任务检查是不是定义了属性【英文标题】:Gradle task check if property is definedGradle 任务检查是否定义了属性 【发布时间】:2015-09-26 22:16:31 【问题描述】:

我有一个执行 testng 测试套件的 gradle 任务。 我希望能够将标志传递给任务,以便使用特殊的 testng xml 套件文件(或者如果未设置标志,则仅使用默认套件)。

gradle test

应该运行默认的标准测试套件

gradle test -Pspecial

应该运行特殊的测试套件

我一直在尝试这样的事情:

test 
    if (special) 
        test(testng_special.xml);
    
    else 
        test(testng_default.xml);
    

但我得到一个未定义的属性错误。解决这个问题的正确方法是什么?

【问题讨论】:

【参考方案1】:
if (project.hasProperty('special'))

应该这样做。

请注意,您选择 testng 套件的操作将不起作用,AFAIK:测试任务没有任何 test() 方法。有关工作示例,请参阅 https://discuss.gradle.org/t/how-to-run-acceptance-tests-with-testng-from-gradle/4107:

test 
    useTestNG 
        suites 'src/main/resources/testng.xml'
    

【讨论】:

@user2506293,这还不够。您需要同时检查项目是否具有属性以及是否已设置 这是 groovy @Opal - null 结果为 false,因此您无需明确检查。 @th3morg 错了,如果属性存在但为空,hasProperty(..) 仍将返回 true,因此如果要检查是否存在而不是空,则必须使用 if (project.hasProperty('special') && project.special) . 我喜欢用:project.properties["special"] == "true"【参考方案2】:

来自Gradle Documentation:

-P, --project-prop

设置根项目的项目属性,例如-Pmyprop=myvalue

所以你应该使用:

gradle test -Pspecial=true

属性名后有值

【讨论】:

使用 JB Nizet 的解决方案不需要将属性设置为 true,只需定义它即可 确实如此,因为您不是在读取属性值,而只是检查该属性是否存在。假设您正在做相反的事情,所以您使用的是 notSpecial 而不是 Special,并且您需要在您的条件下为该属性设置一个 false 值。使用我的解决方案您不会有问题,因为您将使用 JBNizet 的解决方案传递 -PnotSpecial=false,而不是传递的值是 true,因为存在 notSpecial 属性。【参考方案3】:

这对我有用:

test 
    if (properties.containsKey('special')) 
        test(testng_special.xml);
    
    else 
        test(testng_default.xml);
    

【讨论】:

以上是关于Gradle 任务检查是不是定义了属性的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Gradle 中不能将属性声明为输出?

如何使用 gradle API 检查工件是不是存在?

onChange 检查对象的所有属性是不是存在且不是未定义或空字符串

JavaScript,检查嵌套对象属性是不是为空/未定义的优雅方法[重复]

Android Gradle 插件Gradle 扩展属性 ① ( Gradle 扩展属性简介 | Gradle 自定义 task 任务示例 )

Android Gradle 插件Gradle 扩展属性 ① ( Gradle 扩展属性简介 | Gradle 自定义 task 任务示例 )