อ่าน versionName จาก 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 versionName 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 เมื่อพร้อม: gist.github.com/j796160836/ 6ad39ba143bf038bfde8   -  person Yazon2006    schedule 15.01.2020


คำตอบ (9)


ขยายคำตอบของ Khozzy เพื่อดึง versionName ของแพ็คเกจ 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
สิ่งนี้พิมพ์ไม่ได้ระบุในโครงการของฉัน - 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 Task Abbreviation - docs.gradle.org/ ปัจจุบัน/คู่มือผู้ใช้/ - person Khozzy; 31.08.2017

ขอบคุณความคิดเห็นของ 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
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