Ist es möglich, eine Variable in Gradle zu deklarieren, die in Java verwendet werden kann? Grundsätzlich möchte ich einige vars in der build.gradle deklarieren und sie dann (offensichtlich) zur Build-Zeit abrufen. Genau wie ein Pre-Prozessor-Makro in C / C ++ ...
Ein Beispiel für eine Erklärung wäre so etwas ...:
android {
debug {
A_VAR_RETRIEVABLE_IN_JAVA = 42
}
release {
A_VAR_RETRIEVABLE_IN_JAVA = 42+52
}
}
Gibt es eine Möglichkeit, so etwas zu tun?
java
android
gradle
android-gradle-plugin
klefevre
quelle
quelle
<project>/src/
, wenn Sie die Datei erstellendebug/res/values/strings.xml
und eine andere Dateirelease/res/values/strings.xml
, können Sie Ressourcen für die Debug - und Release - Builds in eine etwas sauberen Weise eingestellt , wie gut.android
Plugin zu erreichen ? dh nur mitapply plugin java
? Vielen Dank!Ein Beispiel für die Verwendung eines API-App-Schlüssels in einer Android-Anwendung (Java und XML)
gradle.properties
build.gradle
Verwendung in Java-Code
Verwendung in XML-Code
quelle
./gradlew -PAppKey="1234" testdebug
defaultConfig
Block verwenden: stackoverflow.com/a/51521146/321354@string/APP_KEY_2
Beispiel für die Verwendung von Systemeigenschaften, die in build.gradle festgelegt und aus der Java-Anwendung gelesen wurden (nach der Frage in den Kommentaren):
Grundsätzlich wird bei Verwendung der
test
Aufgabe inbuild.gradle
mit der TestaufgabenmethodesystemProperty
eine Systemeigenschaft festgelegt, die zur Laufzeit übergeben wird:Und hier ist der Rest des Beispielcodes (den Sie wahrscheinlich ableiten könnten, der hier aber trotzdem enthalten ist): Er erhält eine Systemeigenschaft
MY-VAR1
, die zur Laufzeit voraussichtlich auf Folgendes gesetzt wirdVALUE-TEST
:Testfall: Wenn
MY-VAR
nicht festgelegt, sollte der Test fehlschlagen:Ausführen (Hinweis: Test besteht):
Ich habe festgestellt, dass der schwierige Teil tatsächlich die Ausgabe von gradle erhält ... Daher wird hier die Protokollierung konfiguriert (slf4j + logback), und die Protokolldatei zeigt die Ergebnisse an (alternativ run
gradle --info cleanTest test
; es gibt auch Eigenschaften, auf die stdout angewendet wird) die Konsole, aber Sie wissen, warum):Wenn Sie "
systemProperty...
" auskommentieren (was übrigens nur in einertest
Aufgabe funktioniert ), dann:Der Vollständigkeit halber hier die logback config (
src/test/resources/logback-test.xml
):Dateien:
build.gradle
src/main/java/example/HelloWorld.java
src/test/java/example/HelloWorldTest.java
src/test/resources/logback-test.xml
quelle
version = '0.0.1-SNAPSHOT'
über Java-Code kommen?systemProperty
macht wirklich nur Sinn zum Testen, also verstehe ich, warum sie es so gemacht haben (es ist kein Versehen), aber gleichzeitig habe ich auch versucht, gradle für Dinge zu verwenden, für die es nicht gedacht war (wie eine Anwendung DSL ) damit ich mich identifizieren kann. Als Alternative würde ich empfehlen, nur Eigenschaften aus einer Eigenschaftendatei (oder einem Konfigurationsdienst usw.) zu laden, denn wenn es sich nicht im "Test" -Modus befindet, ist es "Produktions" -Modus und erfordert Anwendungslogik. (Das ist sowieso die Theorie.)Sie können ein Build-Konfigurationsfeld erstellen, das während des Builds über Systemumgebungsvariablen überschrieben werden kann:
Fallback wird während der Entwicklung verwendet, Sie können die Variable jedoch überschreiben, wenn Sie den Build auf Jenkins oder einem anderen Tool ausführen.
In Ihrer App build.gradle :
Die Variable wird als verfügbar sein
BuildConfig.SERVER_URL
.quelle
Die Antwort von rciovati ist völlig richtig. Ich wollte nur noch einen Leckerbissen hinzufügen, mit dem Sie auch Variablen für jeden Build-Typ im Standard-Konfigurationsteil Ihres build.gradle erstellen können. Das würde so aussehen:
Auf diese Weise haben Sie Zugriff auf durch
Ich wollte dieses Szenario auch notieren, wenn Sie eine gemeinsame Konfiguration wünschen.
quelle
Ich benutze diesen Code und arbeite sehr gut.
}}
quelle
Wie können Sie das String-Ergebnis der Funktion in buildConfigField einfügen?
Hier ist ein Beispiel für das Erstellungsdatum in einem für Menschen lesbaren Format:
quelle
Ich benutze
Es basiert auf Dennis 'Antwort , greift jedoch auf eine Umgebungsvariable zurück.
quelle
Keine der obigen Antworten gab mir Richtlinien, so dass ich zwei Stunden damit verbringen musste, etwas über Groovy-Methoden zu lernen.
Ich wollte in der Lage sein, gegen eine Produktion, eine Sandbox und eine lokale Umgebung vorzugehen. Da ich faul bin, wollte ich die URL nur an einer Stelle ändern. Folgendes habe ich mir ausgedacht:
Alternative Syntax, da Sie
${variable}
in Groovy-Methoden nur doppelte Anführungszeichen verwenden können.Für mich war es schwer zu verstehen, dass Zeichenfolgen als Zeichenfolgen deklariert werden müssen, die von Anführungszeichen umgeben sind. Aufgrund dieser Einschränkung konnte ich die Referenz nicht
API_HOST
direkt verwenden, was ich ursprünglich tun wollte.quelle