如何在 Gradle 构建中为 versionCode/versionName 提供 属性

How can I provide a property for versionCode/versionName in a Gradle build

我正在尝试从属性文件中读取 versionCode 和 versionName(我似乎可以这样做),并在声明 Android versionCode 和 versionName 时使用这些值(这似乎不起作用).

build.properties

versionCode=21001003
versionName=21.1.3-SNAPSHOT

build.gradle(工作中)

// Read from properties file into Extra properties
def props = new Properties()
file("build.properties").withInputStream { props.load(it) }
props.entrySet().each { it -> project.ext.setProperty((String) it.key, it.value) }

println 'project.versionCode=' + project.versionCode
println 'project.versionName=' + project.versionName
println 'project.ext.versionCode=' + project.ext.versionCode
println 'project.ext.versionName=' + project.ext.versionName

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        versionCode 1 //versionCode
        versionName "versionName"
    }
    ...
}

build.gradle(失败)

// Read from properties file into Extra properties
def props = new Properties()
file("build.properties").withInputStream { props.load(it) }
props.entrySet().each { it -> project.ext.setProperty((String) it.key, it.value) }

println 'project.versionCode=' + project.versionCode
println 'project.versionName=' + project.versionName
println 'project.ext.versionCode=' + project.ext.versionCode
println 'project.ext.versionName=' + project.ext.versionName

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        versionCode project.versionCode
        versionName project.versionName
    }
    ...
}

失败:

2021-08-17T20:45:10.644+1000 [QUIET] [system.out] key=versionName value=21.1.3-SNAPSHOT
2021-08-17T20:45:10.645+1000 [QUIET] [system.out] key=versionCode value=21001003
2021-08-17T20:45:10.645+1000 [QUIET] [system.out] project.versionCode=21001003
2021-08-17T20:45:10.645+1000 [QUIET] [system.out] project.versionName=21.1.3-SNAPSHOT
2021-08-17T20:45:10.645+1000 [QUIET] [system.out] project.ext.versionCode=21001003
2021-08-17T20:45:10.646+1000 [QUIET] [system.out] project.ext.versionName=21.1.3-SNAPSHOT
...
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Where:
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Build file 'C:\Source\wylas\wirelesstiming\android-apps\timekeeper\build.gradle' line: 21
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] A problem occurred evaluating project ':timekeeper'.
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > No signature of method: build_59ns6w30vg653ob1t6cfszcra.android() is applicable for argument types: (build_59ns6w30vg653ob1t6cfszcra$_run_closure3) values: [build_59ns6w30vg653ob1t6cfszcra$_run_closure3@3eb0b9d1]
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Try:
2021-08-17T20:45:10.690+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Run with --stacktrace option to get the stack trace.  Run with --scan to get full insights.
2021-08-17T20:45:10.691+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-08-17T20:45:10.691+1000 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Get more help at https://help.gradle.org
2021-08-17T20:45:10.691+1000 [ERROR] [org.gradle.internal.buildevents.BuildResultLogger] 
2021-08-17T20:45:10.691+1000 [ERROR] [org.gradle.internal.buildevents.BuildResultLogger] BUILD FAILED in 1s

这个答案 表明我正在尝试做的事情应该有效。

如何配置 versionCodeversionName 属性,以便它们从 project.ext.versionCode 中获取值project.ext.versionName

为什么我会失败,这个错误是什么意思?

尝试像这样从您的文件中读取 versionName & versionCode

defaultConfig {

    //...

    Properties buildProperties = new Properties()
    buildProperties.load(new FileInputStream(rootProject.file("build.properties")))

    versionName buildProperties.versionName
    versionCode Integer.parseInt(buildProperties.versionCode)

    // ...
}

其中 build.properties 文件放在项目的根目录中。

问题是 Properties 被读作 String ...

所以 project.versionCode 是一个 String 并且 android.defaultConfig.versionCode 期望得到整数

解决方案是使用

defaultConfig {
   versionCode project.versionCode.toInteger()
}