使用gradle插件有什么不同

我不明白gradle插件块

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

另一个是:

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

在第一个块中,我们有一些插件名称。第二个包和版本。我不知道我应该在哪里用第一块,什么时候用第二块。

100289 次浏览

plugins块是应用插件的较新的方法,它们必须在Gradle插件库中可用。apply方法是较老但更灵活的向构建中添加插件的方法。

新的plugins方法不能在多项目配置中工作(subprojectsallprojects),但可以在每个子项目的构建配置中工作。

我认为随着功能的发展,plugins配置方法将取代旧的方法,但在这一点上,两者都可以同时使用。

正如@cjstehno已经提到的,apply plugin是一个遗留方法,你应该避免。

随着插件DSL的引入,用户应该没有什么理由使用应用插件的传统方法了。这里记录了它,以防构建作者由于当前工作方式的限制而无法使用插件DSL。

使用新的plugins block方法,你可以添加一个插件,并使用可选参数apply控制何时应用它:

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

如果你想在plugins块中应用一个已经添加但尚未应用的插件,你仍然可以使用遗留方法。例如,在主项目中添加了一个插件xyz,但没有应用它,它只应该应用在子项目subPro中:

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


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

注意,您不再需要这个版本了。这个版本在plugins块中是必需的,除非你正在使用一个Core Gradle插件,比如javascala,…

我花了一些时间来理解差异,而试图创建一个Spring Boot应用程序,这就是为什么我在一段时间后再次回答这个问题。下面这个使用Spring Boot插件的例子对我帮助很大:

目前应该使用什么:

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

在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"
现在(在Gradle 6中)你可以在不使用构建脚本的情况下为插件指定存储库名称。 在设置。gradle,我们可以添加插件pluginManagement

pluginManagement {
repositories {
maven {
url '../maven-repo'
}
gradlePluginPortal()
ivy {
url '../ivy-repo'
}
}
}

参考:https://docs.gradle.org/current/userguide/plugins.html#sec:custom_plugin_repositories

不过,我想指出的是,一个插件不需要远程发布才能使用它! 它也可以是本地可用的未发表的插件(无论是约定插件还是其他插件)

如果有人想引用这样一个未发布的本地可用插件, 你必须包括它所谓的“建造”;在所需的组件/build中(通过settings.gradle(.kts)-file识别),如下所示

pluginManagement {
includeBuild '<path-to-the-plugin-dir-containing-the-settings-file>'
}

完成此操作后,可以通过pluginId在__abc0 - dsl块中使用本地插件。

这是使用Gradle插件的两种不同方式。

应用插件的方式:首先从根构建中解决你需要的插件。gradle:

buildscript {
repositories {
// other repositories...
mavenCentral()
}
dependencies {
// other plugins...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44'
}

然后在构建中。你的Android gradle模块应用插件:

apply plugin: 'com.android.application'
apply plugin: 'com.google.dagger.hilt.android'

插件方式:结合解析和应用在你的根构建。gradle:

plugins {
// other plugins...
id 'com.google.dagger.hilt.android' version '2.44' apply false
}

然后在构建中。你的Android gradle模块应用插件:

plugins {
// other plugins...
id 'com.android.application'
id 'com.google.dagger.hilt.android'
}


android {
// ...
}

如果插件需要一个版本,那么将版本号放在settings.gradle文件中的pluginManagement块中比放在plugins块中更安全。

这里更安全的意思是你不会遇到类似plugin request for plugin already on the classpath must not include a version这样的错误。如果你将一个项目includeFlat到另一个使用相同插件的项目中,并且你的插件版本在plugins块中,就会发生这种情况。

所以与其说:

plugins {
id 'pl.allegro.tech.build.axion-release' version '1.10.3'
}

做的事:

plugins {
id 'pl.allegro.tech.build.axion-release'
}

然后在你的settings.gradle文件中:

pluginManagement {
plugins {
id 'pl.allegro.tech.build.axion-release' version '1.10.3'
}
}