如何在 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
这个答案 表明我正在尝试做的事情应该有效。
如何配置 versionCode 和 versionName 属性,以便它们从 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()
}
我正在尝试从属性文件中读取 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
这个答案
如何配置 versionCode 和 versionName 属性,以便它们从 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()
}