Baca versionName dari build.gradle di bash

Apakah ada cara untuk membaca nilai versionName dari file build.gradle proyek Android untuk menggunakannya di bash?

Lebih tepatnya: Bagaimana cara membaca nilai ini dari file dan menggunakannya dalam skrip Travis-CI? Saya akan menggunakannya seperti itu

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

Saya menyiapkan Travis-CI seperti yang dijelaskan dalam postingan ini https://stackoverflow.com/a/28230711/1700776.

Build.gradle saya: http://pastebin.com/uiJ0LCSk


person SUhrmann    schedule 18.02.2016    source sumber
comment
grep versionName build.gradle | awk '{cetak $2}'   -  person alnet    schedule 18.02.2016
comment
Terima kasih - berhasil! Sebenarnya filenya ada di ./app/build.gradle sehingga baris .travis.yml yang dihasilkan adalah - export VERSION=$(grep "versionName" ./app/build.gradle | awk '{print $2}')   -  person SUhrmann    schedule 18.02.2016
comment
Ini tidak akan berhasil di semua kasus. Bagaimana jika ada varian build yang memiliki nama versi berbeda? Bagaimana jika build.gradle menggunakan versionNameSuffix untuk mengubah nama versi per ragam?   -  person Doug Stevenson    schedule 18.02.2016
comment
Sebagai solusinya, Anda bisa mendapatkan versionCode dari apk ketika sudah siap: gist.github.com/j796160836/ 6ad39ba143bf038bfde8   -  person Yazon2006    schedule 15.01.2020


Jawaban (9)


Memperluas jawaban Khozzy, untuk mengambil versionName paket Android Anda dari build.gradle, tambahkan tugas khusus ini:

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

dan aktifkan seperti ini:

gradle -q printVersionName
person Alex Suzuki    schedule 22.11.2017

Anda dapat menentukan tugas khusus, mis.

task printVersion {
    doLast {
        println project.version
    }
}

Dan jalankan di Bash:

$ gradle -q pV
1.8.5
person Khozzy    schedule 22.10.2016
comment
ini cetakan yang tidak ditentukan dalam proyek saya. - person 最白目; 06.12.2016
comment
@dan ganti project.version dengan android.defaultConfig.versionName - person iamreptar; 15.03.2017
comment
Saya tidak mengerti jawaban ini. Apa nama tugas itu? - person Jim; 29.08.2017
comment
@Jim lihat Singkatan Tugas Gradle - docs.gradle.org/ saat ini/panduan pengguna/ - person Khozzy; 31.08.2017

Terima kasih kepada komentar alnet yang saya dapatkan solusi ini (catatan keberatan 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
person SUhrmann    schedule 18.02.2016
comment
Ini tidak akan berfungsi jika ada sedikit rasa atau versi berbeda untuk varian build berbeda. - person Yazon2006; 15.01.2020

Bagaimana dengan ini?

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

Opsi -o membuat grep hanya mencetak bagian yang cocok sehingga Anda dijamin bahwa yang Anda teruskan ke awk hanyalah pola versionCode NUMBER.

person hasen    schedule 31.12.2017
comment
Ini tidak akan berfungsi jika ada sedikit rasa atau versi berbeda untuk varian build berbeda. - person Yazon2006; 15.01.2020

Jika Anda memiliki beberapa ragam dan mengatur informasi versi dalam ragam tersebut, Anda dapat menggunakan sesuatu seperti ini:

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

Anda kemudian dapat memanggilnya menggunakan

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

Saya suka liner yang satu ini hanya mendapatkan nama versi tanpa tanda kutip:

grep "versionName" app/build.gradle | awk '{print $2}' | tr -d \''"\'
person ebaynaud    schedule 19.06.2019
comment
Ini tidak akan berfungsi jika ada sedikit rasa atau versi berbeda untuk varian build berbeda. - person Yazon2006; 15.01.2020

misalnya

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)
            }
        }
    }
}
}

gunakan ${getVersionName()} untuk mendapatkan versi di build.gradle

person Bruce Lee    schedule 18.02.2016
comment
Entah bagaimana alnets solusi yang sangat singkat berhasil. - person SUhrmann; 18.02.2016

Jika Anda mencari versi migrasi untuk Kotlin DSL, inilah yang saya temukan:

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

grep versionName :

Untuk MAC :

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

Untuk Unbuntu :

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

Jadi masukan di build.gradle versionName "8.1.9" beri saya 8.1.9

person Kevin ABRIOUX    schedule 15.10.2019
comment
Ini adalah satu-satunya jawaban yang berfungsi untuk versionName (tanpa menggunakan gradle), terima kasih - person MatPag; 17.10.2019
comment
Ini tidak akan berfungsi jika ada sedikit rasa atau versi berbeda untuk varian build berbeda. - person Yazon2006; 15.01.2020