Gradle Android dependency Produkt-Aromen
Ich würde gerne wissen, ob es eine Möglichkeit gibt, die für ein root-Projekt zu definieren/Spritzen einige Eigenschaften in die Abhängigkeiten. Genauer gesagt, das problem das ich habe ist, dass ein library-Projekt hat zu wissen, ob "free" oder "pro" - java-Quellcode und andere Ressourcen vor dem assemblieren/kompilieren Aufgabe ausgeführt wird. Eine Art, wie die Angabe von Produkt-Varianten für Bibliotheksprojekte, die (geerbt von Eltern-Projekt), aber das ist nicht unterstützt durch das Android-plugin für Gradle. Ändern der Bibliothek, Struktur des Projektes, also die Schaffung von "frei" und "pro" - libs ist nicht eine option.
Edit:
Die besten habe ich es geschafft, zu erreichen, so weit ist so etwas wie dieses:
root: bauen.gradle
android {
...
productFlavors {
free, pro
}
sourceSets {
free {
project(':..:lib') {
groupFreePro = 'free'
//java.srcDirs = ['src', 'free/src']
}
}
pro {
project(':..:lib') {
groupFreePro = 'pro'
//java.srcDirs = ['src', 'pro/src']
}
}
...
}
}
Bibliothek: gradle.bauen
android {
...
sourceSets {
main {
java.srcDirs = [groupFreePro + '/src']
res.srcDirs = [groupFreePro + '/res']
}
}
...
}
}
So, wie ich Spritzen die groupFreePro variable in das " lib " - Projekt. Aber es gibt ein problem mit diesem Ansatz:
Durch die Zeit, wenn die lib-Projekt erhalten, ist es android -> sourceSets Aufgabe der groupFreePro immer auf "pro". Ich vermute, dass es ist, weil alle die sourceSets an der Wurzel Projekt gelesen (und nicht nur die eine Variante, die ich bauen will mit; "frei" zum Beispiel) und damit den letzten Satz/Aufgabe immer überschreibt alle vorher gesetzten Werte groupFreePro.
Wenn ich versuche, den Wert des groupFreePro andere Weise entweder wird überschrieben (wie im obigen Fall), oder ich weiß nicht, die entsprechende Arbeit/Zeit/Ort, wo ich anrufen soll diese variable injection Zeug zu legen Sie die variable auf den gewünschten Wert. Uncommenting java.srcDirs
im root-Projekt nicht helfen.
Ich habe versucht, die Lösung dieser Probleme auf meiner eigenen, aber ich bin wirklich neu auf Gradle und auch der Mangel der ordnungsgemäßen Dokumentation (zumindest für die Android-Teil) lässt mich raten, was zu tun ist, die meisten der Zeit, so dass ich eine Menge von Versuch und Irrtum (aber jetzt bin ich irgendwie stecken geblieben).
- Haben Sie versucht, das 'library' - Projekt ein normales Projekt. Das dependency-management von gradle heißt, Sie können jedes Projekt ziemlich viel wie ein Bibliothek-Projekt.
- Habe ich, aber dann hatte ich andere Probleme mit dem bauen. Ich denke, das problem war, dass andere Bibliotheken, gebaut als normale Projekte, produziert APKs, dass das build-system (oder ich) nicht wusste, wie er gehören in die main project/APK. Ich könnte versuchen, dass wieder, obwohl, sehen Sie, wenn ich ansprechen kann, in einer anderen Weise.
- Ist es möglich für Sie zu teilen code für das einrichten ?
- Für was genau möchtest du mir den code? Das einzige, wo Bibliotheken zu bauen, wie Projekte?
- Sorry für die späte Antwort... ich meinte den code, wo Sie eine standard-Projekt Abhängigkeit, anstatt eine Bibliothek Abhängigkeit. Ich denke, es ist klar, dass dies nicht möglich ist, mit einer Bibliothek. Ich habe etwas ähnliches gemacht mit
ant
aber sich in einen gradle-Implementierung. - Wenn ich versuche, die Lösung habe ich ersetzen
apply plugin: 'android-library'
mitapply plugin: 'android'
in meinem lib-Projekt. Das bauen hat nicht funktioniert, natürlich, so dass ich nicht entdecken, dass die option weitere. - Ah Ok... könnte ich versuchen, das zu tun, für mein Projekt irgendwann... hoffe, ich erinnere mich, es stecken hier, wenn es funktioniert
- Diesen thread besuchen: stackoverflow.com/questions/24860659/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich habe das problem für jetzt. Es ist keine perfekte Lösung, aber es ist gut genug für jetzt.
Update!
Habe ich aktualisiert, die Antwort auf das Letzte 0.9.2 Gradle-plugin und es ist neu(est) Funktionen (meist nur aktualisiert die Bibliothek build-Skripte).
root: gradle.bauen
Den
task.contains("F")
ist es zu handhaben, die gekürzte Versionen oder ausführen von tasks (wenn wir wollten, um das Skript auszuführen, wiegradle aFD
).Den globalen Variablen unter
ext
werden können, auf Standardwerte gesetzt. In diesem Fall, auch, wenn Sie das Skript ausführen, ohne die "Free/Pro" in den Namen der Aufgabe, es sollte gut funktionieren. Der Nachteil von Standard-Werten ist, dass das bauen kann nicht Abstürzen, wenn Sie nicht richtig eingestellt (wenn Sie möchten, dass der build funktioniert nur, wenn "Free/Pro" in der task-name wird angegeben).Bibliothek: gradle.bauen
Update:
Die Bibliothek enthält jetzt
defaultPublishConfig
so dass ich nicht angeben müssenmehr, sowie eigenen Geschmack zusammenstellen jetzt verwendet werden, d.h.
flavor1Compile
(in derdependencies
block).Die option des Schreibens
compile project(path: ':project', configuration: 'flavor1Debug')
imdependencies
block nicht wirklich Arbeit für uns, weil Sie haben, übergeben Sie diese Optionen durch Abhängigkeiten und wenn Sie mehrere Aroma Gruppen/Dimensionen bedeutet das, dass mehr oder weniger alle die Aroma-Kombinationen, die behandelt werden, in "nicht-last" - Abhängigkeiten (d.h. Abhängigkeiten mit anderen Abhängigkeiten (mit mehreren Geschmacksvarianten)) als gut.Die
println
Linien sind nur zu sehen, und stellen Sie sicher, die richtigen params übergeben werden.Den Kopf dieser Lösung (im Vergleich zu Varun ist) ist, dass Sie laufen müssen, nur eine (original -) Aufgabe. Das bedeutet auch, dass es funktioniert (oder sollte es zumindest) mit Android Studio ohne Probleme.
Den Nachteil dieser Lösung ist, dass es nicht funktioniert, wenn Sie bauen wollten, alle Varianten mit
gradle assemble
Befehl (oder ähnliches) fehlt dieFree
Teil der Aufgabe. Ich denke, das könnte auch behandelt werden, aber das werde ich nicht tun, denn die aktuelle Lösung ist gut genug für mich im moment (obwohl, wenn ich die aktuelle Lösung, werde ich wohl aktualisieren diese Antwort so gut).Gibt es andere Lösungen möglich, indem man
gradle.taskGraph.whenReady
aber ich weiß nicht, wie man richtigsrcDirs
(Abhängigkeiten im besonderen). Vorschläge willkommen.Diese Funktion ist jetzt verfügbar nach der Version 0.9 der Gradle-plugin für Android.
Werfen Sie einen Blick hier: http://tools.android.com/tech-docs/new-build-system/migrating_to_09
Kopieren und einfügen hier:
Bibliotheken
DSL für die Bibliotheks-Projekte ist jetzt die gleiche wie für die Anwendung Projekte. Das heißt, Sie können mehr build-Typen, und erstellen Aromen.
- Sie können erstellen/konfigurieren von build-Typen, in der buildTypes { ... } container.
- Sie erstellen Produkt-Aromen mit der productFlavors { ... } container.
- Sie erstellen signingConfigs mit der signingConfigs { ... } container.
Zum Beispiel, wenn Sie in Ihrer Bibliothek:
Ersetzen Sie es mit:
Hier ist die
LibraryVariant
und hier ist dieApkVariant
Blick auf die oben
DSL
Sie nicht Aussehen wie mehrereproductFlavors
unterstützt dieLibraryVariant
Typen..Wenn Ihr
free/pro
sind nicht zu viel ändern, die Sie erstellen können einaar
jeweils für pro-und frei, und verwenden Sie Sie als Abhängigkeiten, wie benötigt von Ihrem app.UPDATE:
Ich habe einige code auf github. Es funktioniert, aber erfordert den Aufruf einer weiteren Aufgabe vor dem eigentlichen bauen/zusammenbauen Aufgabe heißt, auf der app.
https://github.com/varunkochar/Trying-Android-Gradle/tree/master/FakeLibraryProductFlavors
UPDATE:
srcDirs
Ihrer libraryproject wie diese.. Die Quellen gesetzt werden, wenngradle
Lasten auf und bereitet die Aufgaben. So viel wie ich weiß, dieses Problem kann behoben werden, wenn Sie das schreiben eines benutzerdefinierten tasks inbuild.gradle
um diesrcDirs
für Ihre Bibliothek ein Projekt von dort. Ich werde versuchen Sie es später nach der Arbeit und poste hier, wenn ich es an die Arbeit. in der Zwischenzeit können Sie lassen Sie uns alle wissen, wenn Sie keine Fortschritte machen.Produkt Geschmäcker sind nun möglich, in android studio von 0,5 (erfordert gradle-plugin 0.9)
So können Sie effektiv schreiben das DSL jetzt:
Finden Sie unter: http://tools.android.com/tech-docs/new-build-system/migrating_to_09
Und http://tools.android.com/recent/androidstudio050released