web-dev-qa-db-fra.com

Comment appliquer le plugin à une seule saveur dans Gradle?

J'ai un projet Android multi-saveur, multi-build-typé et je veux intégrer le plugin NewRelic. Mais je ne dois l'appliquer qu'à l'un des clients, donc à un seul arôme de produit.
NewRelic utilise une instrumentation et le plug-in génèrerait du code dans d'autres versions si j'y appliquais le plug-in, ce qui n'est pas autorisé pour nous.

Ma question est donc la suivante: comment utiliser la commande apply plugin: something dans le fichier Gradle pour l'appliquer à une seule de mes versions?

35
szidijani

Utilisez ce code:

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

getGradle().getStartParameter().getTaskRequests().toString() renvoie quelque chose comme [DefaultTaskExecutionRequest{args=[:app:generateDevelopDebugSources],projectPath='null'}], de sorte que, comme indiqué dans les commentaires, Develop doit commencer par une majuscule.

30
Pavel Santaev
  1. Définir la variable - def fl
  2. Initialise variable in you Flavors (et/ou builds)

        productFlavors {
    
                freeFlavour {
                    (...)
                    fl = "free"
                }
    
                paidFlavour {
                    (...)
                    fl = "paid"
                }
            }
    
  3. Utilisez si déclaration - 

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

11
Sergey Bondarenko

J'ai trouvé une solution, mais ce n'est pas la meilleure jusqu'à présent. Donc, je ne suis plus sûr que ce que je voulais faire au départ est possible. L'évaluation du dossier de gradation et le choix de la bonne saveur et le bon type de construction se situent à différentes étapes de la construction de la graduelle, et voici ce que j'ai fait:

J'utilise un paramètre de construction à partir de la ligne de commande. Quand ce paramètre est vrai, j'applique le plugin, quand il n'est même pas là, je l'applique aussi (pour IDE build). J'utilise Jenkins pour pouvoir écrire ce paramètre dans le travail de construction.

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

Et vous devez exécuter le gradle build par ceci:

assembleYourApp -PcompileNewRelic=true
5
szidijani

J'ai essayé différentes solutions, mais aucune d'entre elles n'a fonctionné pour moi. C'est ce que je suis venu avec et semble fonctionner aussi loin que j'ai testé:

build.gradle

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

Et en dehors de la configuration, dans le fichier 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'
    }
}
1
Travo