如何覆盖build.gradle中定义的属性?

时间:2013-01-17 21:28:36

标签: gradle

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

gradle.properties:

MY_NAME = "Jonathon"
MY_COLOR = "blue"

的build.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 个答案:

答案 0 :(得分:6)

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

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')
}

答案 1 :(得分:1)

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

  def dest = "name"

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

请参阅this doc

答案 2 :(得分:1)

类似于Johan Stuyts' answer,但单线:

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]

答案 3 :(得分:0)

我自己碰到了这个。我的用例是我分叉项目存储库,而我的同事却没有。我需要将axion-release的存储库远程设置为upstream而不是origin

我不想传递args(或创建别名/ shell函数),所以最终在gradle.propertiesGRADLE_USER_HOME)中创建了~/.gradle并添加了一个属性(名称无关紧要)在那里以及项目的gradle.properties中。在gradle.build中,我总是使用该属性since it always exists

示例

~/.gradle/gradle.properties

scmVersionRepositoryRemote=upstream

[project-root]/gradle.properties

scmVersionRepositoryRemote=origin

[project-root]/build.gradle

scmVersion {
  repository {
    remote = scmVersionRepositoryRemote
  }
}
相关问题