为什么gradle会丢失项目属性

时间:2015-05-19 13:06:06

标签: gradle

我正在使用maven-publish插件向nexus存储库发布工件。我不想将我的nexus存储库的实际凭据放在build.gradle文件中。所以我决定使用如下所示的项目属性

credentials {
            username "$nexus_username"
            password "$nexus_password"
}

现在我可以使用gradle publish -Pnexus_username=<myusername> -Pnexus_password=<mypass>将我的工件发布到我的nexus存储库。但是,为正常的gradle构建继续传递此项目属性没有任何意义。如果我没有通过gradle就会抛出错误Could not find property 'nexus_username'任何人都知道更好的方法来解决这个问题。

2 个答案:

答案 0 :(得分:4)

在挖掘之后找到解决方案

if(! hasProperty("nexus_username")){
    ext.nexus_username=""
}
if(! hasProperty("nexus_password")){
    ext.nexus_password=""
}

如果项目属性不可用,我在这里创建一个空白的用户名和密码。但我仍然觉得这是一个解决方案,而不是正确的解决方案。如果有人找到更优雅的解决方案,请回复。

答案 1 :(得分:0)

我将凭据保存在用户特定的 Gradle属性中,因此只有我的用户帐户才能访问这些值,我可以在Gradle项目中保留虚拟(或未定义)值。这样,如果我将项目分发给其他人或将项目提交给源代码控制,则没有人获得我的个人凭据或设置。

正如Gradle User Guide: The Build Environment中所述,用户特定的属性将覆盖项目的本地 gradle.properties 文件中设置的所有属性,其中属性名称匹配。使用-P在命令行上输入的值仍将优先于两个以前的源。

您的用户特定文件名为gradle.properties,位于GRADLE_USER_HOME环境变量(如果已设置)指定的路径中,默认为:

  • Linux / OS X:~/.gradle/gradle.properties
  • Windows:%USERPROFILE%\.gradle\gradle.properties

然后,您可以在构建脚本中使用hasProperty方法,或通过编辑(或创建)项目 gradle.properties 文件(与 build.gradle 文件处于同一级别):

# Do not put real credentials here!
# Instead, copy to ~/.gradle/gradle.properties and set the values there.
nexus_username =
nexus_password =

此方法的主要警告是,您的特定于用户的属性文件只能为给定的属性名称提供单个值。如果您有多个项目使用相同的属性名称但需要不同的值,那么这可能是一个问题。此外,该文件是纯文本,因此它可能不是密码的最佳位置,除非您愿意冒这个风险。