在Bash中从build.gradle读取versionName

24

有没有一种方法可以从Android项目的build.gradle文件中读取versionName的值,并在bash中使用它?

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

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

我按照这篇文章描述的方式设置了类似于Travis-CI的服务 https://dev59.com/Ruo6XIcBkEYKwwoYGwYw#28230711.

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


8
搜索 build.gradle 文件中包含 "versionName" 的行,并使用 awk 命令打印该行的第二个单词。 - alnet
3
谢谢,它有效!实际上,该文件在“./app/build.gradle”中,因此生成的“.travis.yml”行是“- export VERSION=$(grep "versionName" ./app/build.gradle | awk '{print $2}')”。 - SUhrmann
1
这种方法并不适用于所有情况。如果有不同版本名称的构建变体怎么办?如果 build.gradle 使用 versionNameSuffix 根据品味修改版本名称,又该怎么办? - Doug Stevenson
1
作为解决方法,您可以在apk准备就绪时从中获取versionCode:https://gist.github.com/j796160836/6ad39ba143bf038bfde8 - Yazon2006
10个回答

30

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

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

并这样调用它:

gradle -q printVersionName

1
./gradlew -q printVersionName - Boldijar Paul

16

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

task printVersion {
    doLast {
        println project.version
    }
}

在Bash中执行:

$ gradle -q pV
1.8.5

1
在我的项目中,这将打印“未指定”。 - 最白目
2
@dan 将 "project.version" 替换为 "android.defaultConfig.versionName"。 - iamreptar
我不明白这个答案。任务是如何被调用的? - Jim
@Jim,请看一下Gradle任务缩写 - https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html#sec:task_name_abbreviation - Khozzy

9
感谢alnet提供的评论,我想出了如下解决方案(请注意Doug Stevenson所提出的反对意见):
# 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

2
当存在少量口味或不同版本的构建变体时,它将无法工作。 - Yazon2006

9
我喜欢这个一行代码,可以仅获取版本名称而不包含引号:
grep "versionName" app/build.gradle | awk '{print $2}' | tr -d \''"\'

1
当存在少量口味或不同版本的构建变体时,它将无法工作。 - Yazon2006
谢谢,我添加了一个额外的参数来获取干净的版本名称:grep -m1 "versionName" app/build.gradle | awk '{print $2}' | tr -d \''"\' - Jonathan Nolasco Barrientos

8
这个怎么样?
grep -o "versionCode\s\+\d\+" app/build.gradle | awk '{ print $2 }'
< p > -o 选项使 grep 只打印匹配部分,因此您可以确保传递给 awk 的内容仅为模式 versionCode NUMBER


当存在少量口味或不同版本的构建变体时,它将无法工作。 - Yazon2006

3
如果您有多个风味并在风味中设置版本信息,则可以使用以下方法:
task printVersion{
doLast {
    android.productFlavors.all {
        flavor ->
            if (flavorName.matches(flavor.name)) {
                print flavor.versionName + "-" + flavor.versionCode
            }
    }
}
}

你可以使用以下方式调用它:
./gradlew -q printVersion -PflavorName=MyFlavor

2
如果您正在寻找Kotlin DSL迁移版本,这是我想到的:
tasks.create("printVersionName") {
    doLast { println(version) }
}

1

查找 versionName :

适用于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),谢谢。 - MatPag
当存在少量口味或不同版本的构建变体时,它将无法工作。 - Yazon2006

1

eg

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'非常简短的解决方案有效。 - SUhrmann

0
另一个解决方案是使用 gradle.properties 文件。
  1. gradle.properties 中设置您的值
VERSION_NAME=1.0 with more
  1. 更新您的 gradle.build 文件以从 gradle.properties 获取值
versionName VERSION_NAME
  • 使用grep命令搜索gradle.properties文件而不是gradle.build
  • grep "VERSION_NAME" app/gradle.properties | cut -d "=" -f 2
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接