【问题标题】:How to set project.version by passing version property on gradle command line?如何通过在 gradle 命令行上传递 version 属性来设置 project.version?
【发布时间】:2015-09-22 12:44:57
【问题描述】:

我想用命令行传递的自定义版本构建JAR,例如:

当我像这样执行 gradle build 任务时:

gradle build -Pversion=1.0

应该生成myproject-1.0.jar。

我已尝试将以下行添加到 build.gradle,但没有成功:

version = project.hasProperty('version') ? project['version'] : '10.0.0'

【问题讨论】:

  • 您是否尝试过添加系统属性 (-D) 而不是项目属性 (-P)?
  • @MisaLazovic 它也没有用。
  • 愚蠢的事情,但尝试使用格式gradle [option] [task],而不是gradle [task] [option],即尝试gradle -Pversion=1.0 build。运气好吗?
  • @MisaLazovic 没用。我不认为读取项目或系统属性是问题,因为它可以在我的其他任务中读取。我认为构建任务执行时有问题,可能构建任务无法动态读取版本?
  • @MisaLazovic 对不起,我再次尝试系统属性,它有效!但是为什么项目属性不起作用?

标签: java groovy gradle


【解决方案1】:

仅在gradle.properties 文件中设置属性(即从build.gradle 中删除它)。还要确保选项位于命令之前(如上所述)。

gradle.properties 内容:

version=1.0.12

然后可以在命令行上覆盖版本:

gradle -Pversion=1.0.13 publish

【讨论】:

  • 这是最好的答案,很容易重现,不会弄乱每个 build.gradle 脚本。
  • 这个答案实际上是 Opal 在 2015 年 9 月发布的那个答案的副本。我猜这个答案会得到更多的支持,因为 org.gradle.project.version 太长了。
  • @FranklinYu 这个答案实际上更完整:它记录了如何在gradle.properties 中编写version(无需测试version: 1.0.12version = "1.0.12" 或任何其他的有效性您可以快速想出变体)。
【解决方案2】:

您无法从命令行覆盖现有项目属性,请查看here。因此,请尝试将版本变量重命名为与版本不同的名称,并在命令前使用-P 标志设置它,例如:

gradle -PprojVersion=10.2.10 build 

然后在你的 build.gradle 中

if (project.hasProperty('projVersion')) {
  project.version = project.projVersion
} else {
  project.version = '10.0.0'
}

或者就像你对 ?: operator 所做的那样

【讨论】:

  • 或:project.version = project.findProperty('projVersion') ?: '10.0.0'
  • version = findProperty 'projVersion' ?: '10.0.0',如果您重视简洁
  • 或者,作为我发布的答案:version = (findProperty('version') == 'unspecified') ? '10.0.0' : version
  • “您无法从命令行覆盖现有项目属性”这是完全错误的。
【解决方案3】:

如果您将version 条目移动到gradle.properties 文件,您还可以:

gradle clean build -Dorg.gradle.project.version=1.1

【讨论】:

  • -Dorg.gradle.project.version 太长了 :-) 实际上提供 -Pversion=1.1 就足够了。
  • 是的,可能也是。
【解决方案4】:

version = (findProperty('version') == 'unspecified') ? '0.1' : version

【讨论】:

    【解决方案5】:

    您可以在 cli 上使用 -Pversion=... 传递项目版本,只要您不在 build.gradle 中设置它。如果在 cli 上没有传递任何版本时需要自定义默认值,请使用 gradle.properties 文件,如下所示:version=...

    TL;DR:如果您想稍后通过 cli 更改它,请不要在 build.gradle 文件中设置版本。

    【讨论】:

    • 很好,这让我措手不及,在运行时传递的整个点应该在运行时作为覆盖,但事实并非如此,gradle 甚至不会警告 build.gradle已经有硬编码版本了!!
    • 我同意这不直观。再说一次,我总体上对 gradle 有偏见,并且在任何 maven 项目中都不会错过它。
    • 在 build.gradle 中,您使用硬编码版本以编程方式调用 org.gradle.api.Project.setVersion(xxx)。如果您想将其声明为可以覆盖的属性,请使用 gradle.properties。
    【解决方案6】:

    如果您需要“未指定”以外的默认版本:

    version = "${version != 'unspecified' ? version : 'your-default-version'}"
    

    通过命令行传递版本:

    gradle build -P version=1.0
    

    【讨论】:

      【解决方案7】:

      我发现这是最简单、最干净的方法,不需要 gradle.properties 文件或更改 version 变量名。

      build.gradle:

      // Note - there is intentionally no equals sign here
      version project.hasProperty('version') ? version : '1.0.0'
      

      从命令行:

      ./gradlew -Pversion=1.5.2 build
      

      【讨论】:

        猜你喜欢
        • 2016-04-15
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        相关资源
        最近更新 更多