【问题标题】:Read versionName from build.gradle in bash从 bash 中的 build.gradle 读取 versionName
【发布时间】:2016-02-18 07:34:43
【问题描述】:

有没有办法从 Android 项目的 build.gradle 文件中读取值 versionName 以在 bash 中使用它?

更准确地说:如何从文件中读取此值并在 Travis-CI 脚本中使用它?我会像这样使用它

# ANDROID_VERSION=???
export GIT_TAG=build-$ANDROID_VERSION

我设置了一个 Travis-CI,如本文 https://stackoverflow.com/a/28230711/1700776 中所述。

我的 build.gradle:http://pastebin.com/uiJ0LCSk

【问题讨论】:

  • grep "versionName" build.gradle | awk '{print $2}'
  • 谢谢 - 它有效!实际上该文件位于./app/build.gradle 中,因此生成的.travis.yml 行是- export VERSION=$(grep "versionName" ./app/build.gradle | awk '{print $2}')
  • 这并不适用于所有情况。如果存在具有不同版本名称的构建变体怎么办?如果 build.gradle 使用 versionNameSuffix 来修改每个风味的版本名称怎么办?
  • 作为一种解决方法,您可以在 apk 准备好时从 apk 获取 versionCode:gist.github.com/j796160836/6ad39ba143bf038bfde8

标签: android bash gradle travis-ci


【解决方案1】:

扩展 Khozzy 的答案,要从 build.gradle 中检索您的 Android 包的 versionName,请添加此自定义任务:

task printVersionName {
    doLast {
        println android.defaultConfig.versionName
    }
}

然后调用它:

gradle -q printVersionName

【讨论】:

    【解决方案2】:

    您可以定义自定义任务,即

    task printVersion {
        doLast {
            println project.version
        }
    }
    

    并在 Bash 中执行:

    $ gradle -q pV
    1.8.5
    

    【讨论】:

    • 这会在我的项目中打印“未指定”。
    • @dan 将“project.version”替换为“android.defaultConfig.versionName”
    • 我不明白这个答案。任务是如何调用的?
    • @Jim 看看 Gradle 任务缩写 - docs.gradle.org/current/userguide/…
    【解决方案3】:

    感谢alnet's 的评论我想出了这个解决方案(注意Doug Stevenson's objection):

    # variables
    export GRADLE_PATH=./app/build.gradle   # path to the gradle file
    export GRADLE_FIELD="versionName"   # field name
    # logic
    export VERSION_TMP=$(grep $GRADLE_FIELD $GRADLE_PATH | awk '{print $2}')    # get value versionName"0.1.0"
    export VERSION=$(echo $VERSION_TMP | sed -e 's/^"//'  -e 's/"$//')  # remove quotes 0.1.0
    export GIT_TAG=$TRAVIS_BRANCH-$VERSION.$TRAVIS_BUILD_NUMBER
    # result
    echo gradle version: $VERSION
    echo release tag: $GIT_TAG
    

    【讨论】:

    • 它不适用于不同构建变体的风味或版本不同的情况。
    【解决方案4】:

    这个怎么样?

    grep -o "versionCode\s\+\d\+" app/build.gradle | awk '{ print $2 }'
    

    -o 选项使 grep 仅打印匹配的部分,因此您可以保证传递给 awk 的只是模式 versionCode NUMBER

    【讨论】:

    • 它不适用于不同构建变体的风味或版本不同的情况。
    【解决方案5】:

    我喜欢这一行只获取不带引号的版本名称:

    grep "versionName" app/build.gradle | awk '{print $2}' | tr -d \''"\'
    

    【讨论】:

    • 它不适用于不同构建变体的风味或版本不同的情况。
    【解决方案6】:

    如果你有多种风味,并在风味中设置版本信息,你可以使用这样的东西:

    task printVersion{
    doLast {
        android.productFlavors.all {
            flavor ->
                if (flavorName.matches(flavor.name)) {
                    print flavor.versionName + "-" + flavor.versionCode
                }
        }
    }
    }
    

    然后您可以使用它调用它

    ./gradlew -q printVersion -PflavorName=MyFlavor
    

    【讨论】:

      【解决方案7】:

      例如

      android{
        android.applicationVariants.all { variant ->
          variant.outputs.each { output ->
              def outputFile = output.outputFile
              def fileName
              if (outputFile != null && outputFile.name.endsWith('.apk')) {
                  if (!outputFile.name.contains('unaligned')) {
                      fileName = "yourAppRootName_${variant.productFlavors[0].name}_${getVersionName()}_${variant.buildType.name}.apk"
                      output.outputFile = new File(outputFile.parent + "/aligned", fileName)
                  }
              }
          }
      }
      }
      

      使用${getVersionName()} 获取 build.gradle 中的版本

      【讨论】:

      • 不知何故 alnets' 非常短的解决方案有效。
      【解决方案8】:

      如果您正在寻找 Kotlin DSL 的迁移版本,以下是我的想法:

      tasks.create("printVersionName") {
          doLast { println(version) }
      }
      

      【讨论】:

        【解决方案9】:

        grep 版本名称:

        对于 MAC

        grep -o "versionName\s.*\d.\d.\d" app/build.gradle | awk '{ print $2 }' | tr -d \''"\'

        对于 Unbuntu

        grep -o "versionName\s\+.*" app/build.gradle | awk '{ print $2 }' | tr -d \''"\'

        所以在 build.gradle 中输入versionName "8.1.9" 给我8.1.9

        【讨论】:

        • 这是唯一适用于 versionName 的答案(不使用 gradle),谢谢
        • 它不适用于不同构建变体的风味或版本不同的情况。
        猜你喜欢
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多