9

如何在 build.gradle 文件中设置属性并允许每个开发人员在本地覆盖它?我试过:

gradle.properties:

MY_NAME = "Jonathon"
MY_COLOR = "blue"

构建.gradle:

ext.MY_NAME = "John Doe"
task showit <<{
  println "MY_NAME[" + MY_NAME + "]";
  println "MY_COLOR[" + MY_COLOR + "]";
}

gradle showit给出:

:showit
MY_NAME[John Doe]
MY_COLOR["blue"]

我认为项目根目录的 gradle.properties 文件中定义的属性会覆盖 build.gradle 中定义的同名属性,但事实并非如此。它只填充缺失的属性。

4

4 回答 4

8

检查项目是否有属性,如果没有,设置为默认值:

ext {
    if (!project.hasProperty('MY_NAME')) {
        MY_NAME = 'John Doe'
    }
}

请参阅:https ://docs.gradle.org/current/userguide/build_environment.html#sub:checking_for_project_properties

如果您需要对多个属性执行此操作,您可以定义一个函数:

def setPropertyDefaultValueIfNotCustomized(propertyName, defaultValue) {
    if (!project.hasProperty(propertyName)) {
        ext[propertyName] = defaultValue
    }
}

ext {
    setPropertyDefaultValueIfNotCustomized('MY_NAME', 'John Doe')
}
于 2015-10-29T12:17:31.277 回答
2

类似于Johan Stuyts 的回答,但作为一个单行:

ext.MY_NAME = project.properties['MY_NAME'] ?: 'John Doe'

运行gradle -PMY_NAME="Jeff F." showit给出MY_NAME[Jeff F.]

运行gradle showit给出MY_NAME[John Doe]

于 2019-11-18T11:02:42.507 回答
1

我认为您可以定义一个局部变量,然后像这样覆盖它

  def dest = "name"

  task copy(type: Copy) {
     from "source"
     into name
  }

看到这个文档

于 2013-01-17T21:38:21.357 回答
0

我自己也遇到了这个。我的用例是我 fork 项目 repos 而我的同事没有。我需要将axion-release的存储库远程设置为upstream而不是origin.

我不想传递 args (或创建别名/shell 函数),所以我最终gradle.properties在我的GRADLE_USER_HOME( ~/.gradle) 中创建了一个属性(名称无关紧要),在那里以及项目的gradle.properties. 在gradle.build我总是使用该属性,因为它始终存在

例子

~/.gradle/gradle.properties

scmVersionRepositoryRemote=upstream

[project-root]/gradle.properties

scmVersionRepositoryRemote=origin

[project-root]/build.gradle

scmVersion {
  repository {
    remote = scmVersionRepositoryRemote
  }
}
于 2019-12-18T20:08:45.297 回答