Qual a diferença na aplicação do plugin gradle

187

Eu não entendo o bloco de plugins Gradle

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

e outro:

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

No primeiro bloco, temos algum nome de plugin. no segundo pacote e versão. Não entendo onde devo usar o primeiro bloco e quando o segundo.

Yevgen Kulik
fonte
30
Com Gradle, prepare-se para ver mais de 2 maneiras de fazer a mesma coisa!
Paulo Merson 05/04
7
Gradle é o Perl dos sistemas de construção.
Sahara #

Respostas:

178

O pluginsbloco é o método mais novo de aplicação de plug-ins e eles devem estar disponíveis no repositório de plug-in Gradle . A applyabordagem é o método mais antigo e flexível de adicionar um plug-in à sua compilação.

O novo pluginsmétodo não funciona em configurações de vários projetos ( subprojects, allprojects), mas funcionará na configuração de compilação para cada projeto filho.

Eu pensaria que, à medida que a funcionalidade progride, o pluginsmétodo de configuração ultrapassará a abordagem mais antiga, mas, neste momento, ambas podem ser e são usadas simultaneamente.

cjstehno
fonte
4
Lembre-se de que a aplicação de um plug-in usando os plug-ins DSL ( plugins {...}) não funciona para seus plug-ins particulares ou da empresa que não são publicados no repositório oficial do plug-in Gradle. É por isso que espero que a abordagem antiga pelo menos sobreviva até que a nova suporte à pesquisa em repositórios particulares.
Datz
2
pluginsfunciona em multi-projeto, de acordo com o tutorial da Gradle (versão 5.6.2 da Gradle) Guides.gradle.org/creating-multi-project-builds/… Usa pluginsblock with apply falsepara adicionar o plug-in ao projeto geral, mas não adiciona para o projeto raiz. O subprojeto usa pluginsblocos novamente para adicionar o plugin.
yetsun 29/09/19
Realmente não faz sentido usar o pluginsexcesso apply plugin.
Sahara #
1
2020 e eu ainda estou usandoapply plugin
Blundell
Isso é absolutamente terrível, duas diretivas com sintaxe e entradas completamente diferentes, além das quais são incompatíveis. Gradle é de longe a maior dor no pescoço ao usar Java e Kotlin.
Christian
57

Como já mencionado por @cjstehno, o apply pluginé um método legado que você deve evitar.

Com a introdução do DSL de plug-ins, os usuários devem ter poucos motivos para usar o método herdado de aplicar plug-ins. Ele está documentado aqui, caso um autor de construção não possa usar os plug-ins DSL devido a restrições de como ele funciona atualmente.

Com o novo plugins blockmétodo, você pode adicionar um plug-in e controlar quando aplicá-lo usando um parâmetro opcional apply:

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

Você ainda usaria o método legado em situações nas quais deseja aplicar um plug-in já adicionado, mas não aplicado, em seu pluginsbloco. Por exemplo, no projeto mestre, um plug xyz- in é adicionado, mas não aplicado, e deve ser aplicado apenas em um subprojeto subPro:

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

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

Observe que você não precisa mais da versão. A versão é necessária no pluginsbloco, a menos que você está usando um dos plugins Núcleo Gradle, tais como java, scala...

Passei algum tempo entendendo a diferença enquanto tentava criar um Spring Bootaplicativo, e é por isso que respondo novamente depois de um tempo. O exemplo a seguir para usar o Spring Bootplug-in me ajudou muito:

O que deve ser usado atualmente:

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

O que havia sido usado antes do 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
fonte
De alguma forma, isso dá a impressão errada. Não se pode simplesmente converter apply plugin xxxpara plugins { id xxx }(tentei e não funcionou)
Christian
Penso que a resposta e a documentação citada afirma isso claramente. Isso depende do seu caso. Você pode fornecer mais informações sobre o seu caso ou publicá-las em outra pergunta.
Mousa