web-dev-qa-db-fra.com

Comment définir et utiliser une constante dans un script de construction Gradle (Android)?

Je travaille sur une application Android avec Gradle comme système de construction.

Mon objectif est d'utiliser une valeur (un nom de package) comme applicationId:

productFlavors {
   orange {
      applicationId "com.fruits.Android.orange"
      // ...

Mais aussi de l'exposer via BuildConfig pour que Java y ait accès).

Cet accès doit provenir de l'extérieur de la saveur (à savoir, la version gratuite de l'application doit connaître le nom du package de la version payante afin qu'elle puisse inviter l'utilisateur à effectuer une mise à niveau dans Play Store).

Je voudrais donc faire quelque chose comme ça:

productFlavors {
   orange {
      applicationId orangeProPackage
      // ...


buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ?

Seulement, je ne sais pas comment définir orangeProPackage pour qu'il soit visible dans tout le build.gradle et ne casse pas le script.

Puisqu'il y a quelques saveurs différentes, il serait préférable que je puisse en quelque sorte regrouper toutes ces constantes comme ça (je suppose?):

def proPackages = [
        orange: "..."
        Apple: "..."
        banana: "..."
]

puis vous y référer de manière claire et descriptive comme proPackages.orange etc.

La question est, comment y parvenir?

Ce n'est pas un doublon de Est-il possible de déclarer une variable dans Gradle utilisable en Java?

J'ai vu cette question (et quelques autres). Je sais comment déclarer buildConfigFields, j'en ai déjà beaucoup. Ma question concerne la réutilisation de la même valeur qu'un buildConfigField et applicationId.

20
Konrad Morawski

Seulement, je ne sais pas comment définir orangeProPackage pour qu'il soit visible dans tout le build.gradle et ne casse pas le script.

Vous pouvez le mettre dans gradle.properties dans la racine de votre projet. Comme les autres .properties fichiers, c'est juste un magasin de valeurs-clés:

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp

Vous vous référez ensuite à elle comme une simple variable de chaîne globale (ORANGE_PRO_PACKAGE) dans votre build.gradle:

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE

ce serait mieux si je pouvais en quelque sorte regrouper toutes ces constantes

Tout ce qui implique .properties les fichiers ne géreront pas cela. Là, vous envisagez peut-être de définir des globaux dans le niveau supérieur build.gradle fichier juste en code Groovy ordinaire ou quelque chose.

22
CommonsWare