Qual è la differenza nell'applicazione del plugin gradle


187

Non capisco il blocco dei plugin gradle

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

e l'altro:

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

Nel primo blocco abbiamo alcuni nomi di plugin. nel secondo pacchetto e versione. Non capisco dove dovrei usare il primo blocco e quando il secondo.


30
Con Gradle, preparati a vedere 2+ modi per fare la stessa cosa!
Paulo Merson,

7
Gradle è il Perl dei sistemi di build.
Sakra,

Risposte:


178

Il pluginsblocco è il metodo più recente per applicare i plugin e devono essere disponibili nel repository dei plugin Gradle . L' applyapproccio è il metodo più vecchio, ma più flessibile di aggiungere un plugin alla tua build.

Il nuovo pluginsmetodo non funziona nelle configurazioni multiprogetto ( subprojects, allprojects), ma funzionerà sulla configurazione di compilazione per ciascun progetto figlio.

Penserei che man mano che la funzionalità avanza, il pluginsmetodo di configurazione supererà l'approccio precedente, ma a questo punto entrambi possono essere e vengono utilizzati contemporaneamente.


4
Tieni presente che l'applicazione di un plug-in utilizzando i plug-in DSL ( plugins {...}) non funziona per i tuoi plug-in privati ​​o plug-in aziendali che non sono pubblicati nel repository ufficiale di plug-in Gradle. Ecco perché spero che il vecchio approccio sopravviverà almeno fino a quando il nuovo non supporterà la ricerca nei repository privati.
Datz,

2
pluginslavora a multi-progetto, secondo Gradle tutorial (Gradle versione 5.6.2) guides.gradle.org/creating-multi-project-builds/...~~V~~singular~~3rd Usa pluginsblocco con apply falseper aggiungere il plugin per il progetto nel suo complesso, ma non aggiunge al progetto di root. Il sottoprogetto utilizza pluginsnuovamente i blocchi per aggiungere il plug-in.
yetsun,

Non ha davvero senso usare pluginsover apply plugin.
Sakra,

1
2020 e sto ancora usandoapply plugin
Blundell il

Questo è assolutamente terribile, due direttive con sintassi e input completamente diversi, per di più incompatibili. Gradle è di gran lunga il più grande dolore al collo quando si usano Java e Kotlin.
Christian,

57

Come già accennato da @cjstehno, apply pluginè un metodo legacy che dovresti evitare.

Con l'introduzione dei plug-in DSL, gli utenti dovrebbero avere poche ragioni per utilizzare il metodo legacy di applicazione dei plug-in. È documentato qui nel caso in cui un autore di build non possa utilizzare i plug-in DSL a causa delle restrizioni sul modo in cui funziona attualmente.

Con il nuovo plugins blockmetodo, puoi aggiungere un plugin e controllare quando applicarlo usando un parametro opzionale apply:

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

Utilizzeresti comunque il metodo legacy in situazioni in cui desideri applicare un plug-in già aggiunto ma non applicato nel tuo pluginsblocco. Ad esempio, nel progetto principale xyzviene aggiunto un plug-in ma non applicato e deve essere applicato solo in un sottoprogetto subPro:

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

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

Si noti che non è più necessaria la versione. È necessaria la versione del pluginsblocco a meno che non si sta utilizzando uno dei plugin core Gradle, come ad esempio java, scala...

Ho trascorso un po 'di tempo a capire la differenza mentre provavo a creare Spring Bootun'applicazione, ed è per questo che rispondo di nuovo dopo un po'. Il seguente esempio per l'utilizzo del Spring Bootplugin mi ha aiutato molto:

Cosa dovrebbe essere attualmente utilizzato:

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

Cosa era stato usato prima del Grado 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"

Questo in qualche modo dà l'impressione sbagliata. Non si può semplicemente convertire apply plugin xxxin plugins { id xxx }(l'ho provato e non ha funzionato)
Christian

Penso che la risposta e la documentazione citata lo affermino chiaramente. Questo dipende dal tuo caso. Puoi fornire ulteriori informazioni sul tuo caso o pubblicarlo in una domanda diversa.
Mousa, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.