【问题标题】:How can I provide a property for versionCode/versionName in a Gradle build如何在 Gradle 构建中为 versionCode/versionName 提供属性
【发布时间】:2021-08-17 10:52:57
【问题描述】:

我正在尝试从属性文件中读取 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

这个答案https://stackoverflow.com/a/29597784/493682 表明我正在尝试做的事情应该有效。

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

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

【问题讨论】:

    标签: android gradle build.gradle


    【解决方案1】:

    问题是Properties 被读作String ...

    所以project.versionCodeStringandroid.defaultConfig.versionCode 期望得到整数

    解决办法是使用

    defaultConfig {
       versionCode project.versionCode.toInteger()
    }
    

    【讨论】:

    • 谢谢@Selvin。我希望 Gradle 错误消息更准确。我怀疑我是否会自己发现。
    【解决方案2】:

    尝试从您的文件中读取versionNameversionCode,如下所示:

    defaultConfig {
    
        //...
    
        Properties buildProperties = new Properties()
        buildProperties.load(new FileInputStream(rootProject.file("build.properties")))
    
        versionName buildProperties.versionName
        versionCode Integer.parseInt(buildProperties.versionCode)
    
        // ...
    }
    

    build.properties 文件位于项目根目录的位置。

    【讨论】:

    • @Selvin 我实际上检查了我项目中的代码并在我看到我错过了转换为 int 部分后更新了答案。
    • 感谢您以更简单的方式读取属性文件。
    猜你喜欢
    • 2017-10-12
    • 2012-03-26
    • 2021-12-31
    • 2015-02-07
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多