1

Android Gradle ビルド環境ごと:

現在、「readVersions」gradle タスクを使用して、ローカルの version.properties ファイルからバージョン コードとバージョン名を読み取っています。アプリにフレーバーを追加中です。これらのフレーバーには異なるバージョンが必要です。そこで、フレーバー固有の "res" および "src" ディレクトリの隣にあるフレーバー固有のディレクトリ (例: one/version.properties、two/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
}

「flavor」ディレクトリ内の「version.properties」ファイルにアクセスする際に使用できるように、フレーバーを組み込んだ新しい readVersions タスクが必要です。

私が試してみました:

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

しかし、「preBuild」ステップでアクティブなフレーバーのタスク のみを実行する方法がわかりません。

概念的に私はこれが欲しい:

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

再編成してより簡単な解決策を見つけることをお勧めする人へ。現在、私のビルド プロセスには、これらの version.properties ファイルに対する他の依存関係があります。バージョン コードとバージョン名を 2 つの場所で定義することもできます (たとえば、「フレーバー」内とフレーバーの version.properties ファイル内ですが、DRY 構成が本当に必要です)。

4

1 に答える 1

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")
    }

注意すべきことの 1 つは、私の以前の試みは、versionName と versionCode の設定を preBuild タスクの依存関係に組み込むことでした。この時点で、'versionName' を適切に設定できなくなっているようです。私のタスクは正しいフレーバーから設定していませんでした。そのため、別の解決策を思いつきましたが、設定後にそれを読むと常に「null」でした。

コメントと提案をくれた CommonsWare に感謝します。

于 2016-04-04T18:19:38.237 に答える