web-dev-qa-db-ja.com

Gradleの1つのフレーバーのみにプラグインを適用するにはどうすればよいですか?

マルチフレーバー、マルチビルドタイプのAndroidプロジェクトがあり、NewRelicプラグインを統合したいのですが、顧客の1人だけに適用する必要があるため、1つの製品にのみ適用する必要があります。味。
NewRelicはインストルメンテーションを使用し、プラグインを他のフレーバーに適用した場合、プラグインは他のフレーバーでコードを生成しますが、それは許可されていません。

だから私の質問は:apply plugin: something gradleファイルのコマンドを1つのフレーバーにのみ適用するには?

42
szidijani

このコードを使用してください:

_if (!getGradle().getStartParameter().getTaskRequests()
        .toString().contains("Develop")){
    apply plugin: 'com.google.gms.google-services'
}
_

getGradle().getStartParameter().getTaskRequests().toString()は_[DefaultTaskExecutionRequest{args=[:app:generateDevelopDebugSources],projectPath='null'}]_のようなものを返すので、コメントで述べたようにDevelopは大文字で始める必要があります。

38
Pavel Santaev
  1. 変数を定義-_def fl_
  2. フレーバー(またはビルド、あるいはその両方)の変数を初期化する

    _    productFlavors {
    
                freeFlavour {
                    (...)
                    fl = "free"
                }
    
                paidFlavour {
                    (...)
                    fl = "paid"
                }
            }
    _
  3. Ifステートメントを使用-

    if (fl == "free") { apply plugin: something }

12

さまざまな解決策を試しましたが、どれも私にとってうまくいきませんでした。これは私が思いついたものであり、私がテストした限りでは機能しているようです:

build.gradle

productFlavors {
    someFlavorWithGoogleGcm {
        dimension "type"
        applicationId "com.example.withGcm"
        ext.useGoogleGcm = true
    }
    someFlavorWithoutGoogleGcm {
        dimension "type"
        applicationId "com.example.withoutGcm"
    }
}

そして、構成の外側、build.gradleファイル:

Android.productFlavors.each { flavor ->
    if (getGradle().getStartParameter().getTaskRequests().toString().toLowerCase().contains(flavor.name) && flavor.ext.useGoogleGcm) {
        println("Building flavor with Google GCM [${flavor.name}] - applying plugin")
        apply plugin: 'com.google.gms.google-services'
    }
}
6
Travo

私は解決策を見つけましたが、今のところ最善ではありません。ですから、私が最初にやりたかったことは可能かどうか、もうわかりません。 Gradleファイルの評価と正しいフレーバーとビルドタイプの選択はGradleビルドのさまざまなフェーズにあるため、私が行ったことは次のとおりです。

コマンドラインからビルドパラメーターを使用します。そのパラメーターがtrueの場合は、プラグインを適用します。プラグインが存在しない場合も適用します(IDE buildの場合)。Jenkinsを使用しているため、ビルドにそのパラメーターを書き込むことができますジョブ。

build.gradleファイル:

// First we have to attach a task to the project, which will be running first
gradle.projectsEvaluated {
    preBuild.dependsOn(applyNewRelicByProperty)
}

// Then check on the parameter, which comes from the command line
task applyNewRelicByProperty {
    if(!project.hasProperty('compileNewRelic')) {
        // NewRelic on: 'compileNewRelic' property not set, so running from IDE.
        apply plugin: 'newrelic'
    } else if(project.hasProperty('compileNewRelic') && project.getProperties().get('compileNewRelic').equals('true')) {
        // NewRelic on: 'compileNewRelic' property is set and it is 'true'.
        apply plugin: 'newrelic'
    } else {
        // NewRelic off
        println("No NewRelic")
    }
}

そして、あなたはこれによってgradleビルドを実行する必要があります:

assembleYourApp -PcompileNewRelic=true
5
szidijani