【问题标题】:Android build with Gradle Release plugin使用 Gradle Release 插件构建 Android
【发布时间】:2014-07-18 06:46:33
【问题描述】:

我想在Android Project 中使用Gradle Release Plugin。

我配置好了,一切正常,除了一件事:

Gradle Release Plugin 在其任务之一中更改gradle.properties 文件中的项目版本,但此更改不会影响Android Project's versionName,因为我发现使用println() gradle 在运行任何任务之前对其进行初始化。

有没有办法在初始化后在某些 gradle 任务中更改 Android Project versionName?

这是我build.gradle的一部分

android {
    compileSdkVersion 19
    buildToolsVersion '19.1.0'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 213
        versionName version // to change it, please visit gradle.properties file
        println('Project version: ' + version) // this line executed BEFORE any gradle task :(
    }

    ...
}

我只能看到一种解决方案:不同的 gradle 执行

  1. 将更改 gradle.properties 中的版本
  2. 将执行构建过程,但这是一种不好的解决方法,尤其是对于Gradle Release Plugin

【问题讨论】:

    标签: android gradle release android-gradle-plugin


    【解决方案1】:

    从 2.1.0 版开始,gradle-release plugin 在单独的进程中执行构建。这可以确保版本在整个构建过程中以及所有其他依赖于从一开始就设置的版本的插件都是正确的。

    2.1.0

    ...

    常见:在发布期间重构了构建过程以单独运行 过程。这有望解决与某些其他问题的所有问题 像新的 maven-publish 或 bintray 插件这样的插件。

    常见:添加了 beforeReleaseBuild 和 afterReleaseBuild 钩子,其中 两者都与构建本身在同一进程中运行。

    ...

    see full changelog

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 谢谢,我改了。
    【解决方案2】:

    在你的 build.gradle 中插入这个函数

    task('increaseVersionCode') << {
        def manifestFile = file("src/main/AndroidManifest.xml")
        def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
        def manifestText = manifestFile.getText()
        def matcher = pattern.matcher(manifestText)
        matcher.find()
        def versionCode = Integer.parseInt(matcher.group(1))
        def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
        manifestFile.write(manifestContent)
    }
    
    task('incrementVersionName') << {
        def manifestFile = file("src/main/AndroidManifest.xml")
        def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\"")
        def manifestText = manifestFile.getText()
        def matcherVersionNumber = patternVersionNumber.matcher(manifestText)
        matcherVersionNumber.find()
        def majorVersion = Integer.parseInt(matcherVersionNumber.group(1))
        def minorVersion = Integer.parseInt(matcherVersionNumber.group(2))
        def pointVersion = Integer.parseInt(matcherVersionNumber.group(3))
        def buildVersion = Integer.parseInt(matcherVersionNumber.group(4))
        def mNextVersionName = majorVersion + "." + minorVersion + "." + pointVersion + "." + (buildVersion + 1)
        def manifestContent = matcherVersionNumber.replaceAll("versionName=\"" + mNextVersionName + "\"")
        manifestFile.write(manifestContent)
    }
    
    
    tasks.whenTaskAdded { task ->
        if (task.name == 'generateReleaseBuildConfig') {
            task.dependsOn 'increaseVersionCode'
            task.dependsOn 'incrementVersionName'
        }
    }
    

    免责声明:我已经创建了这个要点。

    完整的要点。 https://gist.github.com/ascariandrea/9991499

    【讨论】:

      【解决方案3】:

      这是我使用的一种解决方法,它将任务的执行拆分为多个 gradle 执行。它适用于 svn,但可以适应:

      https://stackoverflow.com/a/26659974/256770

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多