您可能从未听说过的服务缺少用户名,密码或令牌? 这通常发生在您尝试执行任何操作(例如仅构建项目)时,不仅发生在使用给定的插件(例如在线代码覆盖工具)时。 我不想修改我的环境,而只是为另一个开源项目提供一个小的修复。 这很烦我,我想更改它。 从Gradle 2.13开始,这成为可能。 但是,让我们从原因开始(如果您仅对解决方案感兴趣,请前进至最后两段)。
为什么会显示“找不到财产……”?
大多数Gradle插件都需要配置。 可以直接在build.gradle
设置一些属性,但是其他一些属性(尤其是凭据)最好保留在~/.gradle/gradle.properties
。 因此,插件配置部分通常如下所示:
bintray {
user = project.getProperty('bintrayUser')
key = project.getProperty('bintrayKey')
...
}
或者那个:
bintray {
user = getProperty('bintrayUser')
key = getProperty('bintrayKey')
...
}
甚至更短:
bintray {
user = bintrayUser
key = bintrayKey
...
}
对于在其本地配置中定义了bintrayUser
和bintrayKey
的项目开发人员而言,它工作正常,但是对于每个未每日上传到Bintray的人,它都会失败:
* What went wrong:
A problem occurred evaluating root project 'another-nice-open-source-project'.
> Could not find property 'bintrayKey' on com.jfrog.bintray.gradle.BintrayExtension_Decorated@2ecc563.
结果是project.getProperty()
(未提及显式分配)只是在未找到特定属性时引发异常。 不好的是,代码是在配置短语中执行的。 因此,即使与该特定插件无关的每项任务(例如gw tasks
或gw wrapper
)的执行都会失败。
作为解决方法,必须执行防护检查:
bintray { //Gradle <2.13
user = hasProperty('bintrayUser') ? getProperty('bintrayUser') : ''
key = hasProperty('bintrayKey') ? getProperty('bintrayKey') : ''
...
}
看起来不太紧凑。 作为另一个选择,可以将虚拟占位符保留在项目配置中,但是从Gradle 2.13开始,有一种更好的方法来应对。
project.findProperty()
Gradle 2.13是我对新方法project.findProperty() 贡献的第一个版本。 它的行为与getProperty()
相同,但是不抛出异常,而是返回null
值。 这大大简化了分配:
bintray { //Gradle 2.13+
user = findProperty('bintrayUser') ?: ''
key = findProperty('bintrayKey') ?: ''
...
}
有人可能会说Optional
作为返回值可能会更好,但这是一个API,并且Gradle支持早于8的Java。
摘要
对我来说, findProperty
是我在Gradle中经常寻找的一种方法。 很遗憾,我花了一年多的时间才提出这项要求。 Gradle 2.13刚刚发布,跨项目的版本升级将逐步进行。 这可能需要一些时间,但是每个迁移到2.13的项目都将能够简化其配置,使“无法在插件Y上找到属性X”错误消息成为过去的回忆(当然,除非您确实需要将特定的插件配置为用它)。