如何从命令行在 gradle 中定义 teamcity['build.number'] 属性



有没有办法从命令行定义teamcity['build.number']属性?我试过-Pteamcity.build.number=1,但没有成功。

我有一个build.gradle文件,里面有这个任务:

distTar {
    baseName = project.name+'.'+
                project.version+'.'+
                System.getProperty("system.rnf.brach_name")+'.'+
                teamcity['build.number']+'.'+
                teamcity['build.vcs.number.1']
    archiveName = baseName+'.tar'
    into(baseName) {
        from '.'
        include 'config/*'
        include 'run-script/*.sh'
    }
}

它在构建服务器上工作,但它让所有的开发人员都抓狂,因为我们的机器上没有安装teamcity,任何gradle命令都会给我们一个错误:

$ gradle tasks
FAILURE: Build failed with an exception.
* Where:
Build file '/home/me/work/myproject/build.gradle' line: 31
* What went wrong:
A problem occurred evaluating root project 'myproject'.
> Could not find property 'teamcity' on task ':MyProject:distTar'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED

给定您描述的场景-允许开发人员在本地机器上运行构建,该机器也需要在TeamCity中运行-我发现这对我有效(TeamCity 7):

if (hasProperty("teamcity")) {
  version = teamcity["build.number"]
} else {
  version = '0.0-beta'
}

默认情况下,gradle生成的jar文件将自动在其名称中使用"version"。因此,在build.gradle文件中有了这段代码,开发人员构建的工件将标记为"0.0-beta",同一项目的TeamCity构建将使用TeamCity构建号。

但是,例如,如果你想在清单中添加信息,你会做一些类似的事情:

jar {
  manifest {
    attributes 'Implementation-Title': rootProject.name, 'Implementation-Version': version
  }
}

我希望这有帮助?

这在命令行中起作用

task hello << {
  println project.ext['teamcity.build.number']
}

你称之为

gradle hello -Pteamcity.build.number=1.45

希望它也能在您的脚本

中工作

这有点破解,但这是我想出的临时解决方案。但仍在等待更好的结果。

在build.gradle中,我添加了:

if (hasProperty("dev")) {
    apply from: 'teamcity.gradle'
}

我在teamcity.gradle:中有这个

task teamcity {
    teamcity['build.number'] = 1
    teamcity['build.vcs.number.1'] = 0
}

我在grade.properties中有这个:

dev=1

gradle.properties和teamcity.gradle在.gitignore中。您可以在命令行中定义它,而不是将dev=1添加到grade.properties中:-Pdev=1,这样您就可以在同一台机器上使用或不使用破解(尽管我认为这没有用)

这适用于我的build.gradle.kts(Kotlin语法);我正在TeamCity中构建应用程序,build.number是其中的一个现有属性,其形式为8.2.0.XXX,其中XXX是在TeamCity中运行的构建的订单号。

android {
    ...
    defaultConfig {
        applicationId("something")
        versionCode(1)
        versionName("8.2")
        if (rootProject.hasProperty("build.number")) {
            versionName(rootProject.properties["build.number"] as String?)
        }
        ...
    }
}

可以使用BuildConfig.VERSION_NAME从代码中引用该变量。

如果从IDE或cmd行启动(其中不存在属性build.number),则应用程序将以8.2作为BuildConfig.VERSION_NAME构建。

最新更新