1

ビルドプロセスに含ま:カスタムアクティブフレーバー固有のGradleのタスクは、Android Gradleのビルド環境パー

私は現在、地元version.propertiesからの私のバージョンコードとバージョン名を読みは「readVersions」Gradleのタスクを経由してファイル。私は自分のアプリにフレーバーを追加する過程にあります。これらのフレーバーには異なるバージョンが必要です。だから私はフレーバー特有の "res"と "src"ディレクトリの隣に2つの異なるversion.propertiesファイルをフレーバー特有のディレクトリ(例えば1つ/ version.properties、2つ/ version.properties)の中に入れることを考えていました。

私はreadVersionsタスクを持っている:

task readVersions() { 
    def Properties versionProps = new Properties() 
    def versionPropsFile = file('version.properties') 
    if (versionPropsFile.exists()) 
     versionProps.load(new FileInputStream(versionPropsFile)) 
    def v_code = (versionProps['VERSION_CODE'] ?: "0").toInteger() 
    def v_name = versionProps['VERSION_NAME'] 

    // Set 
    versionCode v_code 
    versionName v_name 
} 

project.afterEvaluate { 
    preBuild.dependsOn readVersions 
} 

私は「味」内「version.properties」ファイルにアクセスするには、それを使用できるように、私は味を組み込んだ新しいreadVersionsタスクを持っていると思いますディレクトリ。

android.productFlavors.all{ flavor -> 
    task ("${flavor.name}_readVersions")<<{ 
    def versionPropsFile = file(flavor.name+'/version.properties') 
... 

をしかし、私は、「事前に作成」ステップの間に実行するようにだけアクティブな味のタスクを取得する方法がわからない:

私が試してみました。再編と単純解決策を見つけることをお勧め方へ

project.afterEvaluate { 
    preBuild.dependsOn ${active_flavor}_readVersions 
} 

は、概念的には私がこれをしたいです。私のビルドプロセスは現在、これらのversion.propertiesファイルに依存しています。私 だけ(例えば「味」の内側だけでなく、味のversion.propertiesファイル内の、しかし私は本当にはDRYのconfigsをしたい )2つの場所でバージョンコードとバージョン名を定義

+0

「アクティブフレーバー」はありません。あなたの 'build.gradle'ファイルはあなたのアプリをビルドしません。あなたの 'build.gradle'ファイルはあなたのアプリを構築するための* how *のオブジェクトモデルを構築します。オブジェクトモデルを構築します。適切なフレーバー特有のタスクが独自のフレーバー特有のタスクに依存する場合、両方のフレーバーのために 'dependsOn'が必要です。 – CommonsWare

+0

はい、私はこれを理解しています。それが私の「概念的」記述子の中でその部分を強調しようとした理由です。私がしようとしていることを理解していますか?私がしようとしていることを達成するオブジェクトモデルを構築する方法を知っていますか?もしそうでなければ私の目標をさらに定義しようとすることができます。 – FishStix

+0

私はフレーバーのカスタム "dependsOn"を作成することを躊躇しています。適切なフレーバー固有のタスクは、独自のフレーバー固有のタスクに依存します。私が10種類か20種類のフレーバーで終わるとどうなりますか?私は$ {flavor.name} /version.propertiesファイルからローカルのversionCode/Nameを取得したいだけです。これを達成するには20のカスタムタスクが本当に必要ですか? – FishStix

答えて

0

ことができ、私は「私を分割readVersions readVersionName "と "readVersionCode"

def getVersionName(flavor) { 
    return getVersion(flavor, "VERSION_NAME", false) 
} 
def getVersionCode(flavor) { 
    return getVersion(flavor, "VERSION_CODE", true) 
} 
def getVersion(flavor, type, intRequired) { 
    // READ 
    def Properties versionProps = new Properties() 
    def versionPropsFile = file("${flavor}/version.properties") 
    if (versionPropsFile.exists()) 
     versionProps.load(new FileInputStream(versionPropsFile)) 
    def value = versionProps["${type}"] 
    return intRequired ? value.toInteger() : value 
} 

は、その後、私はそれぞれの味の定義内でそれらを実行」へのタスク":

productFlavors { 
    one { 
     versionName getVersionName("one") 
     versionCode getVersionCode("one") 
    } 
    two { 
     versionName getVersionName("two") 
     versionCode getVersionCode("two") 
    } 

一つのことに注意することは、私の前バージョニングでは、versionNameとversionCodeの設定をpreBuildタスクの依存関係に組み込もうとしていました。この時点では、 'versionName'は正しく設定できなくなりました。私の仕事は正しい味からそれを設定していなかったので、別の解決策を思いついたのですが、設定した後にそれを読むことは常に「ヌル」でした。

コメントと提案をいただきありがとうございました。

関連する問題