Est-il possible de déclarer une variable dans Gradle utilisable en Java? En gros, je voudrais déclarer quelques vars dans le build.gradle et ensuite l'obtenir (évidemment) au moment de la construction. Tout comme une macro pré-processeur en C / C ++ ...
Un exemple de déclaration serait quelque chose comme ça ...:
android {
debug {
A_VAR_RETRIEVABLE_IN_JAVA = 42
}
release {
A_VAR_RETRIEVABLE_IN_JAVA = 42+52
}
}
Y a-t-il un moyen de faire quelque chose comme ça?
java
android
gradle
android-gradle-plugin
klefevre
la source
la source
<project>/src/
, si vous créez le fichierdebug/res/values/strings.xml
et un autre fichierrelease/res/values/strings.xml
, vous pouvez également définir des ressources pour les versions de débogage et de publication d'une manière légèrement plus propre.android
plugin? c'est à dire en utilisant simplementapply plugin java
? Merci!Un exemple d'utilisation d'une clé d'application Api dans une application Android (Java et XML)
gradle.properties
build.gradle
Utilisation en code java
Utilisation en code xml
la source
./gradlew -PAppKey="1234" testdebug
defaultConfig
bloc: stackoverflow.com/a/51521146/321354@string/APP_KEY_2
Exemple utilisant les propriétés du système, défini dans build.gradle, lu à partir de l'application Java (suivi de la question dans les commentaires):
Fondamentalement, en utilisant la
test
tâche dansbuild.gradle
, avec la méthode de tâche de testsystemProperty
définissant une propriété système transmise au moment de l'exécution:Et voici le reste de l'exemple de code (que vous pourriez probablement déduire, mais qui est inclus ici de toute façon): il obtient une propriété système
MY-VAR1
, attendue au moment de l'exécution, définie surVALUE-TEST
:Cas de test: s'il
MY-VAR
n'est pas défini, le test doit échouer:Exécuter (remarque: le test réussit):
J'ai trouvé que la partie délicate est en fait d'obtenir la sortie de gradle ... Donc, la journalisation est configurée ici (slf4j + logback), et le fichier journal affiche les résultats (alternativement, exécutez
gradle --info cleanTest test
; il existe également des propriétés qui obtiennent stdout à la console, mais, vous savez, pourquoi):Si vous commentez "
systemProperty...
" (qui, en fait, ne fonctionne que dans unetest
tâche), alors:Pour être complet, voici la configuration logback (
src/test/resources/logback-test.xml
):Des dossiers:
build.gradle
src/main/java/example/HelloWorld.java
src/test/java/example/HelloWorldTest.java
src/test/resources/logback-test.xml
la source
version = '0.0.1-SNAPSHOT'
via le code Java?systemProperty
n'a vraiment de sens que pour les tests, donc je vois pourquoi ils l'ont fait de cette façon (ce n'est pas un oubli), mais en même temps, j'ai aussi essayé d'utiliser gradle pour des choses auxquelles il n'était pas destiné (comme une application DSL ) afin que je puisse identifier. Comme alternative, je recommanderais simplement de charger les propriétés à partir d'un fichier de propriétés (ou d'un service de configuration, etc.), car s'il n'est pas en mode "test", il s'agit du mode "production" et nécessite une logique d'application. (C'est la théorie, de toute façon.)Vous pouvez créer un champ de configuration de configuration remplaçable via des variables d'environnement système lors de la génération:
Fallback est utilisé lors du développement, mais vous pouvez remplacer la variable lorsque vous exécutez la génération sur Jenkins ou un autre outil.
Dans votre application build.gradle :
La variable sera disponible en tant que
BuildConfig.SERVER_URL
.la source
La réponse de rciovati est tout à fait correcte. Je voulais juste ajouter une autre information que vous pouvez également créer des variables pour chaque type de build dans la partie de configuration par défaut de votre build.gradle. Cela ressemblerait à ceci:
Cela vous permettra d'avoir accès à travers
Je voulais juste noter ce scénario si vous voulez une configuration commune.
la source
J'utilise ce code et je travaille très bien.
}
la source
Comment pouvez-vous insérer le résultat String de la fonction dans buildConfigField
Voici un exemple de date de construction dans un ensemble de formats lisibles par l'homme:
la source
j'utilise
Il est basé sur la réponse de Dennis mais l'attrape à partir d'une variable d'environnement.
la source
Aucune des réponses ci-dessus ne m'a donné de directives, j'ai donc dû passer deux heures à apprendre les méthodes Groovy.
Je voulais pouvoir aller à l'encontre d'une production, d'un bac à sable et d'un environnement local. Parce que je suis paresseux, je ne voulais changer l'URL qu'à un seul endroit. Voici ce que j'ai trouvé:
Syntaxe alternative, car vous ne pouvez l'utiliser
${variable}
qu'avec des guillemets doubles dans les méthodes Groovy.Ce que j'ai eu du mal à comprendre, c'est que les chaînes doivent être déclarées comme des chaînes entourées de guillemets. En raison de cette restriction, je ne pouvais pas utiliser la référence
API_HOST
directement, ce que je voulais faire en premier lieu.la source