¿Cuál es la diferencia en la aplicación del complemento Gradle?

187

No entiendo el bloque de complementos de Gradle

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

y otro:

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

En el primer bloque tenemos un nombre de complemento. en el segundo paquete y versión. No entiendo dónde debo usar el primer bloque y cuándo el segundo.

Yevgen Kulik
fuente
30
¡Con Gradle, prepárate para ver más de 2 formas de hacer lo mismo!
Paulo Merson el
77
Gradle es el Perl de los sistemas de compilación.
sakra

Respuestas:

178

El pluginsbloque es el método más nuevo para aplicar complementos, y deben estar disponibles en el repositorio de complementos de Gradle . El applyenfoque es el método más antiguo pero más flexible de agregar un complemento a su compilación.

El nuevo pluginsmétodo no funciona en configuraciones multiproyecto ( subprojects, allprojects), pero funcionará en la configuración de compilación para cada proyecto secundario.

Creo que a medida que avanza la funcionalidad, el pluginsmétodo de configuración superará el enfoque anterior, pero en este punto ambos pueden ser y se usan simultáneamente.

cjstehno
fuente
44
Tenga en cuenta que aplicar un complemento utilizando los complementos DSL ( plugins {...}) no funciona para sus complementos privados o complementos de la empresa que no están publicados en el repositorio oficial de complementos de Gradle. Es por eso que espero que el viejo enfoque al menos sobreviva hasta que el nuevo admita la búsqueda en repositorios privados.
Datz
2
pluginsfunciona en proyectos múltiples, de acuerdo con el tutorial de Gradle (Gradle versión 5.6.2) guides.gradle.org/creating-multi-project-builds/... Utiliza pluginsblock with apply falsepara agregar el complemento al proyecto general, pero no agrega a la raíz del proyecto. El subproyecto usa pluginsbloques nuevamente para agregar el complemento.
yetsun
Realmente no tiene sentido usar pluginsmás apply plugin.
sakra
1
2020 y todavía estoy usandoapply plugin
Blundell
Esto es absolutamente terrible, dos directivas con sintaxis y entradas completamente diferentes, además de las cuales son incompatibles. Gradle es, con mucho, el mayor dolor en el cuello cuando se usa Java y Kotlin.
Christian
57

Como ya mencionó @cjstehno, este apply plugines un método heredado que debe evitar.

Con la introducción de los complementos DSL, los usuarios deberían tener pocas razones para usar el método heredado de aplicar complementos. Se documenta aquí en caso de que un autor de compilación no pueda usar los complementos DSL debido a restricciones en cómo funciona actualmente.

Con el nuevo plugins blockmétodo, puede agregar un complemento y controlar cuándo aplicarlo utilizando un parámetro opcional apply:

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

Todavía usaría el método heredado en situaciones en las que desea aplicar un complemento ya agregado pero no aplicado en su pluginsbloque. Por ejemplo, en el proyecto maestro xyzse agrega un complemento pero no se aplica, y debe aplicarse solo en un subproyecto subPro:

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

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

Tenga en cuenta que ya no necesita la versión. La versión se requiere en el pluginsbloque a menos que utilice uno de los complementos del núcleo Gradle, tales como java, scala, ...

Pasé un tiempo entendiendo la diferencia al intentar crear una Spring Bootaplicación, y es por eso que estoy respondiendo esto nuevamente después de un tiempo. El siguiente ejemplo para usar el Spring Bootcomplemento me ayudó mucho:

Lo que debería usarse actualmente:

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

Lo que se había usado antes de 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
fuente
Esto de alguna manera da la impresión equivocada. Uno no puede simplemente convertir apply plugin xxxa plugins { id xxx }(Lo probé y no funcionó)
Cristiano
Creo que la respuesta y la documentación citada lo indican claramente. Esto depende de tu caso. Puede proporcionar más información sobre su caso o publicar esto en una pregunta diferente.
Mousa