Прочитать имя версии из build.gradle в bash

Есть ли способ прочитать значение versionName из файла build.gradle проекта Android, чтобы использовать его в 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


person SUhrmann    schedule 18.02.2016    source источник
comment
grep имя_версии build.gradle | awk '{напечатать $2}'   -  person alnet    schedule 18.02.2016
comment
Спасибо, это работает! На самом деле файл находится в ./app/build.gradle, поэтому результирующая строка .travis.yml будет - export VERSION=$(grep "versionName" ./app/build.gradle | awk '{print $2}').   -  person SUhrmann    schedule 18.02.2016
comment
Это не будет работать во всех случаях. Что делать, если есть варианты сборки с разными именами версий? Что, если build.gradle использует versionNameSuffix для изменения имен версий для каждого варианта?   -  person Doug Stevenson    schedule 18.02.2016
comment
В качестве обходного пути вы можете получить versionCode из apk, когда он будет готов: 6ad39ba143bf038bfde8   -  person Yazon2006    schedule 15.01.2020


Ответы (9)


Расширяя ответ Хоззи, чтобы получить имя версии вашего пакета Android из build.gradle, добавьте эту пользовательскую задачу:

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

и вызвать его так:

gradle -q printVersionName
person Alex Suzuki    schedule 22.11.2017

Вы можете определить пользовательскую задачу, т.е.

task printVersion {
    doLast {
        println project.version
    }
}

И выполнить его в Bash:

$ gradle -q pV
1.8.5
person Khozzy    schedule 22.10.2016
comment
это печатает unspecified в моем проекте. - person 最白目; 06.12.2016
comment
@dan замените project.version на android.defaultConfig.versionName - person iamreptar; 15.03.2017
comment
Я не понимаю этот ответ. Как называется задание? - person Jim; 29.08.2017
comment
@Jim взгляните на аббревиатуру задачи Gradle — docs.gradle.org/ текущий/руководство пользователя/ - person Khozzy; 31.08.2017

Благодаря комментарию alnet я придумал это решение (обратите внимание на возражение Дуга Стивенсона) :

# 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
person SUhrmann    schedule 18.02.2016
comment
Это не сработает в случае, когда есть несколько вариантов или разные версии для разных вариантов сборки. - person Yazon2006; 15.01.2020

Как насчет этого?

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

Опция -o заставляет grep печатать только совпадающую часть, поэтому вы гарантированно передаете awk только шаблон versionCode NUMBER.

person hasen    schedule 31.12.2017
comment
Это не сработает в случае, когда есть несколько вариантов или разные версии для разных вариантов сборки. - person Yazon2006; 15.01.2020

Если у вас есть несколько вариантов и вы устанавливаете информацию о версии во вкусе, вы можете использовать что-то вроде этого:

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

Затем вы можете вызвать его, используя

./gradlew -q printVersion -PflavorName=MyFlavor
person Clive Jefferies    schedule 13.02.2019

Мне нравится этот лайнер, чтобы получить только название версии без кавычек:

grep "versionName" app/build.gradle | awk '{print $2}' | tr -d \''"\'
person ebaynaud    schedule 19.06.2019
comment
Это не сработает в случае, когда есть несколько вариантов или разные версии для разных вариантов сборки. - person Yazon2006; 15.01.2020

например

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

person Bruce Lee    schedule 18.02.2016
comment
Каким-то образом работает очень короткое решение alnets'. - person SUhrmann; 18.02.2016

Если вы ищете мигрированную версию для Kotlin DSL, вот что я придумал:

tasks.create("printVersionName") {
    doLast { println(version) }
}
person matfax    schedule 14.10.2018

имя_версии 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

person Kevin ABRIOUX    schedule 15.10.2019
comment
Это единственный ответ, работающий для versionName (без использования gradle), спасибо - person MatPag; 17.10.2019
comment
Это не сработает в случае, когда есть несколько вариантов или разные версии для разных вариантов сборки. - person Yazon2006; 15.01.2020