【问题标题】:Pass arguments to gradle task from command line从命令行将参数传递给 gradle 任务
【发布时间】:2021-01-15 17:17:27
【问题描述】:

如何在 gradle 任务中从命令行访问参数的值?我知道这可以通过-P 完成,但我的属性文件中有相同的属性,并且 gradle 从属性文件而不是命令行中选择参数。如何优先接受来自命令行的参数而不是属性文件?

build.gradle

Properties props = new Properties()
props.load(new FileInputStream("./local.properties"))
props.each { prop ->
    project.ext.set(prop.key, prop.value)
}

task print {
    println("Gets = ${remote}");
}

local.properties

remote=from_properties

来自 cmd 的命令

gradle print -Premote=from_commandline

输出

Gets = from_properties

【问题讨论】:

  • 为什么不直接使用 Gradle 支持的gradle.properties 文件?
  • 我有来自不同环境的不同属性文件,如本地、舞台、产品等
  • 你打算如何注入要加载的属性文件?在您的示例中,您对 local.properties 的加载进行了硬编码,并且这样做,您违反了 Gradle 属性优先规则(请参阅 docs.gradle.org/current/userguide/build_environment.html )。也许您可以简单地实施检查以避免属性覆盖?喜欢:props.each { prop -> if (!project.hasProperty(prop.key)) project.ext.set(prop.key, prop.value) }
  • @M.Ricciuti 为了简单起见,我正在对文件进行硬编码。在这里,我想要的只是找到一种方法,当参数和属性都具有相同的名称时,如何将命令行参数优先于属性文件中的属性。
  • @ParagKadam 我明白了。您是否测试过我提出的“解决方法”?

标签: gradle groovy


【解决方案1】:

如果您打算将属性文件用于 Gradle 属性,则不应使用自己的 local.properties 文件。

只需改用gradle.properties

另外请注意,您不应该在其配置块中声明任务代码,您需要使用doFirstdoLast

gradle.properties

remote = properties

build.gradle

task print {
    doLast { println "Gets = ${remote}" }
}

如果您运行./gradlew print,您将看到Gets = properties

如果您运行./gradlew print -Premote=foo,您应该会看到Gets = foo


也就是说......如果你真的想要自己的属性文件,你需要自己实现优先级顺序,Gradle 无法猜测你喜欢什么。

例如,您可以在设置属性之前检查它是否已经设置:

def props = new Properties()
props.load(new FileInputStream("./local.properties"))
props.each { key, value ->
    if (!project.hasProperty(key)) {
      project.ext.set(key, value)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多