2015-10-26 46 views
7

私はそのビルドシステムとしてのGradleとAndroidのアプリケーションに取り組んでいます。しかし、またGradleビルドスクリプト(Android)で定数を定義して使用する方法は?

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

Javaコードは、それへのアクセス権を持つようにBuildConfigを経由して、それを公開する:

私の目的はapplicationIdとして値(パッケージ名)を使用することです。

このアクセスは味外側からにする必要があり(それがPlayストアでのアップグレードのためにユーザを促すことができるように、すなわち、アプリの無料版は有料版のパッケージ名を知っている必要があります)。

だから私はそのような何かをしたいと思います:

productFlavors { 
    orange { 
     applicationId orangeProPackage 
     // ... 


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

のみ、私はそれが全体のbuild.gradleに見えますし、スクリプトを壊さないように orangeProPackageを定義するかどうかはわかりません。

いくつかの異なる味をありますので、私はそのような何とかグループのすべてのこれらの定数(私は推測?)ことができれば、それが最善のようになります。その後、

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

とは清潔で、記述方法などにそれらを参照してください。 proPackages.orangeなど

の質問は、どのようにそれを達成することですか?

これは私がその質問(およびいくつかの他を)見てきましたIs it possible to declare a variable in Gradle usable in Java?

の複製ではありません。私はbuildConfigFieldsを宣言する方法を知っている、私はすでにたくさん持っている。私の質問はおよそbuildConfigFieldapplicationId同じ値を再利用しています。

+0

可能な重複は、[Javaで使用可能なのGradleで変数を宣言することは可能ですか?](http://stackoverflow.com/questions/17197636/is-it-possible-to-declare-a-variable-in- gradle-in-java) – ThomasThiebaud

+0

@Maloubobolaそれは重複していません。私はその質問(といくつかの他のもの)を見てきました。私はbuildConfigFieldsを宣言する方法を知っている、私はすでにたくさん持っている。私の質問は、 'buildConfigField' *と*' applicationId'と同じ値を再利用することです。 –

答えて

15

orangeProPackageを定義する方法がわからないので、build.gradle全体に表示され、スクリプトが中断されることはありません。

あなたのプロジェクトルートにgradle.propertiesを入れることができます。他の.propertiesのファイルと同じように、それだけで、キーと値のストアです:

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp 

あなたは、あなたのbuild.gradleでシンプルなグローバル文字列変数(ORANGE_PRO_PACKAGE)としてそれを参照してください。

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE 

それは次のようになり何とかこれらの定数をすべてグループ化できれば最高です

.propertiesを含むものは何も処理しませんそれ。そこでは、トップレベルのbuild.gradleファイル内のグローバルを、単純なGroovyコードなどで定義することができます。

+4

実際には 'buildConfigField 'String'、 'ORANGE_PRO_PACKAGE'、 '' '+ ORANGE_PRO_PACKAGE +'" ''でなければなりません。そうしないと、値はBuildConfigの文字列リテラルとして生成されず、ビルドが中断します。しかし、それ以外は - それは動作します、チップのおかげで。 –

+0

フレーバーごとに異なる '.properties'ファイルを使用することはできますか? 1つの利点は、この方法で、フレーバー間で同じキー(gradle.properties内)を保持できることです。ファイルが変更されるので、フレーバーに基づいて、それらのキーの値は異なります。風味に基づいて値が変化する文字列に対して同じ 'gradle.properties'ファイルを使用する場合、同じ' .properties'ファイル内に異なるキーを持つ必要があります。 –

+1

@ShobhitPuri: "それぞれのフレーバーに異なる.propertiesファイルを使用できますか?" AFAIKには何も自動ではありません。しかしGradleはGroovyなので、ビルドスクリプトで必要な開発マシンのファイルを読むことができます。 – CommonsWare

関連する問題