Quelle est la différence dans l'application du plugin Gradle

187

Je ne comprends pas le bloc des plugins Gradle

apply plugin: 'someplugin1'
apply plugin: 'maven'

et autre:

plugins {
   id 'org.hidetake.ssh' version '1.1.2'
}

Dans le premier bloc, nous avons un nom de plugin. dans le deuxième package et version. Je ne comprends pas où je devrais utiliser le premier bloc et quand le second.

Yevgen Kulik
la source
30
Avec Gradle, préparez-vous à découvrir plus de 2 façons de faire la même chose!
Paulo Merson
7
Gradle est le Perl des systèmes de construction.
sakra

Réponses:

178

Le pluginsbloc est la nouvelle méthode d'application des plugins, et ils doivent être disponibles dans le référentiel de plugins Gradle . L' applyapproche est la méthode la plus ancienne mais la plus flexible d'ajout d'un plugin à votre build.

La nouvelle pluginsméthode ne fonctionne pas dans les configurations multi-projets ( subprojects, allprojects), mais fonctionnera sur la configuration de génération pour chaque projet enfant.

Je pense qu'à mesure que la fonctionnalité progresse, la pluginsméthode de configuration dépassera l'ancienne approche, mais à ce stade, les deux peuvent être et sont utilisées simultanément.

cjstehno
la source
4
Gardez à l'esprit que l'application d'un plugin à l'aide des plugins DSL ( plugins {...}) ne fonctionne pas pour vos plugins privés ou les plugins d'entreprise qui ne sont pas publiés dans le repo officiel de plugins Gradle. C'est pourquoi j'espère que l'ancienne approche survivra au moins jusqu'à ce que la nouvelle prenne en charge la recherche dans des référentiels privés.
Datz
2
pluginsfonctionne en multi-projets, selon le tutoriel Gradle (Gradle version 5.6.2) guides.gradle.org/creating-multi-project-builds/... Il utilise pluginsblock with apply falsepour ajouter le plugin au projet global, mais n'ajoute pas vers le projet racine. Le sous-projet utilise pluginsà nouveau des blocs pour ajouter le plugin.
yetsun
Il est vraiment inutile d'utiliser pluginsover apply plugin.
sakra
1
2020 et j'utilise toujoursapply plugin
Blundell
C'est absolument terrible, deux directives avec une syntaxe et des entrées complètement différentes, en plus d'être incompatibles. Gradle est de loin la plus grande douleur au cou lors de l'utilisation de Java et Kotlin.
Christian
57

Comme déjà mentionné par @cjstehno, il apply plugins'agit d'une méthode héritée que vous devriez éviter.

Avec l'introduction des plugins DSL, les utilisateurs devraient avoir peu de raisons d'utiliser l'ancienne méthode d'application des plugins. Il est documenté ici au cas où un auteur de build ne peut pas utiliser les plugins DSL en raison de restrictions dans son fonctionnement actuel.

Avec la nouvelle plugins blockméthode, vous pouvez ajouter un plugin et contrôler quand l'appliquer à l'aide d'un paramètre facultatif apply:

plugins {
    id «plugin id» version «plugin version» [apply «false»]
}

Vous utiliseriez toujours la méthode héritée dans les situations où vous souhaitez appliquer un plugin déjà ajouté mais non appliqué dans votre pluginsbloc. Par exemple, dans le projet maître, un plugin xyzest ajouté mais pas appliqué et il ne doit être appliqué que dans un sous-projet subPro:

plugins {
  id "xyz" version "1.0.0" apply false
}

subprojects { subproject ->
    if (subproject.name == "subPro") {
        apply plugin: 'xyz'
    }
}

Notez que vous n'avez plus besoin de la version. La version est requise dans le pluginsbloc , sauf si vous utilisez l' un des plug - ins de base Gradle, tels que java, scala...

J'ai passé du temps à comprendre la différence en essayant de créer une Spring Bootapplication, et c'est pourquoi je réponds à nouveau après un certain temps. L'exemple suivant d'utilisation du Spring Bootplugin m'a beaucoup aidé:

Ce qui doit être utilisé actuellement:

plugins {
  id "org.springframework.boot" version "2.0.1.RELEASE"
}

Ce qui avait été utilisé avant Gradle 2.1:

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE"
  }
}

apply plugin: "org.springframework.boot"
Mousa
la source
Cela donne en quelque sorte une mauvaise impression. On ne peut pas simplement convertir apply plugin xxxà plugins { id xxx }(je l' ai essayé et ça n'a pas marché )
Christian
Je pense que la réponse et la documentation citée le disent clairement. Cela dépend de votre cas. Vous pouvez fournir plus d'informations sur votre cas ou publier ceci dans une autre question.
Mousa