1

Per Android-Gradle Umgebung bauen:Individuellen Aktiv Geschmack spezifische gradle Aufgabe, die in Build-Prozess

ich zur Zeit meine Version-Code und Version Namen von einem lokalen version.properties Datei über eine "readVersions" gradle Aufgabe lesen. Ich bin dabei, meiner App Aromen hinzuzufügen. Diese Aromen würden verschiedene Versionen benötigen. Also habe ich darüber nachgedacht, zwei verschiedene version.properties-Dateien in geschmacksspezifische Verzeichnisse (z. B. one/version.properties, zwei/version.properties) neben den geschmacksspezifischen "res" - und "src" -Verzeichnissen zu setzen.

Ich habe eine readVersions Aufgabe:

task readVersions() { 
    def Properties versionProps = new Properties() 
    def versionPropsFile = file('version.properties') 
    if (versionPropsFile.exists()) 
     versionProps.load(new FileInputStream(versionPropsFile)) 
    def v_code = (versionProps['VERSION_CODE'] ?: "0").toInteger() 
    def v_name = versionProps['VERSION_NAME'] 

    // Set 
    versionCode v_code 
    versionName v_name 
} 

project.afterEvaluate { 
    preBuild.dependsOn readVersions 
} 

Ich mag eine neue readVersions Aufgabe haben, die den Geschmack enthält, so dass ich es beim Zugriff auf die „version.properties“ Datei im „Geschmack“ verwenden kann, Verzeichnis.

Ich habe versucht:

android.productFlavors.all{ flavor -> 
    task ("${flavor.name}_readVersions")<<{ 
    def versionPropsFile = file(flavor.name+'/version.properties') 
... 

Aber dann weiß ich nicht, wie nur der aktiven Geschmack bekommen die Aufgabe während der „Prebuild“ Schritt auszuführen.

Konzeptionell möchte ich dies:

project.afterEvaluate { 
    preBuild.dependsOn ${active_flavor}_readVersions 
} 

Denen, die einfacher Lösungen empfehlen reorganisieren und zu finden. Mein Buildprozess hat derzeit andere Abhängigkeiten von diesen version.properties-Dateien. Ich könnte definieren nur den Versionscode und Versionsnamen an zwei Stellen (zB in dem „Geschmack“ sowie innerhalb eines version.properties Datei Geschmacks, aber ich wirklich will DRY configs)

+0

Es gibt keinen "aktiven Geschmack". Ihre Datei 'build.gradle' erstellt Ihre App nicht. Ihre Datei 'build.gradle' erstellt ein Objektmodell von * how * zum Erstellen Ihrer App. Erstellt Abarbeitung des Objektmodells. Sie müssen für beide Varianten "dependsOn" verwenden, wobei die entsprechenden geschmackspezifischen Aufgaben von Ihren benutzerdefinierten geschmackspezifischen Aufgaben abhängen. – CommonsWare

+0

Ja, das verstehe ich. Deshalb habe ich versucht, diesen Teil in meinem "konzeptuellen" Deskriptor zu betonen. Verstehst du, was ich versuche zu tun? Weißt du, wie man ein Objektmodell baut, das das erreicht, was ich versuche? Ich kann versuchen, mein Ziel weiter zu definieren, wenn nicht. – FishStix

+0

Ich zögere, eine Reihe von benutzerdefinierten "dependsOn" für Aromen zu erstellen, wobei die entsprechenden geschmacksspezifischen Aufgaben von Ihren benutzerdefinierten geschmacksspezifischen Aufgaben abhängen. Was passiert, wenn ich 10 oder 20 Geschmacksrichtungen bekomme? Ich möchte nur die lokale Version Code/Name aus der Datei $ {flavour.name} /version.properties greifen. Benötige ich wirklich 20 benutzerdefinierte Aufgaben, um dies zu erreichen? – FishStix

Antwort

0

ich teilte meine " readVersions“Aufgabe in "readVersionName" und "readVersionCode"

def getVersionName(flavor) { 
    return getVersion(flavor, "VERSION_NAME", false) 
} 
def getVersionCode(flavor) { 
    return getVersion(flavor, "VERSION_CODE", true) 
} 
def getVersion(flavor, type, intRequired) { 
    // READ 
    def Properties versionProps = new Properties() 
    def versionPropsFile = file("${flavor}/version.properties") 
    if (versionPropsFile.exists()) 
     versionProps.load(new FileInputStream(versionPropsFile)) 
    def value = versionProps["${type}"] 
    return intRequired ? value.toInteger() : value 
} 

Dann habe ich sie innerhalb jeder Geschmack Definition aus:

productFlavors { 
    one { 
     versionName getVersionName("one") 
     versionCode getVersionCode("one") 
    } 
    two { 
     versionName getVersionName("two") 
     versionCode getVersionCode("two") 
    } 

Eine Sache zu beachten, meine pre Bei vious versuch wurde versucht, die Einstellungen von versionName und versionCode in Abhängigkeiten von der PreBuild-Aufgabe zu integrieren. Zu diesem Zeitpunkt scheint es so zu sein, dass "versionName" nicht mehr richtig eingestellt werden kann. Meine Aufgabe bestand nicht darin, den richtigen Geschmack zu finden, weshalb ich eine andere Lösung gefunden habe, aber das Lesen nach dem Einstellen war immer 'null'.

Vielen Dank CommonsWare für die Kommentare und Vorschläge.