我不理解gradle插件块
apply plugin: 'someplugin1'
apply plugin: 'maven'
以及另一个:
plugins {
id 'org.hidetake.ssh' version '1.1.2'
}
在第一个区块中,我们有一些插件名称。在第二个区块中是软件包和版本号。我不明白我应该在什么情况下使用第一个区块以及何时使用第二个区块。
我不理解gradle插件块
apply plugin: 'someplugin1'
apply plugin: 'maven'
以及另一个:
plugins {
id 'org.hidetake.ssh' version '1.1.2'
}
在第一个区块中,我们有一些插件名称。在第二个区块中是软件包和版本号。我不明白我应该在什么情况下使用第一个区块以及何时使用第二个区块。
plugins
块是应用插件的较新方法,必须在Gradle插件仓库中提供。 apply
方法是添加构建插件的旧方法,但更加灵活。plugins
方法不适用于多项目配置(subprojects
, allprojects
),但适用于每个子项目的构建配置。plugins
配置方法将取代旧方法,但目前两种方法可以并且同时使用。plugins {...}
)应用插件不适用于未发布到官方Gradle插件存储库的私人插件或公司插件。
这就是为什么我希望旧方法至少能在新方法支持搜索私有存储库之前继续存在的原因。 - Datz将插件添加到整个项目,但不会将其添加到根项目。子项目再次使用
plugins`块来添加该插件。 - yetsun正如 @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'
}
}
请注意,您不再需要版本号。除非您使用java
,scala
等Core Gradle插件之一,否则在plugins
块中需要版本号。
我花了些时间理解其中的区别,因为我尝试创建一个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"
apply plugin xxx
转换为plugins { id xxx }
(我尝试过,但不起作用)。 - Christianapply plugin
转换为 plugins { id xxx }
,你可以在 https://plugins.gradle.org/ 找到你的插件,这将给你正确的 id
,通常与使用 apply plugin
的限定名称略有不同。 - Monkey Supersonicapply plugin
的方式首先在根目录下的build.gradle文件中解决所需的插件。
示例:
buildscript {
repositories {
// other repositories...
mavenCentral()
}
dependencies {
// other plugins...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44'
}
apply plugin: 'com.android.application'
apply plugin: 'com.google.dagger.hilt.android'
在您的根build.gradle文件中结合resolve和apply。
示例:
plugins {
// other plugins...
id 'com.google.dagger.hilt.android' version '2.44' apply false
}
plugins {
// other plugins...
id 'com.android.application'
id 'com.google.dagger.hilt.android'
}
android {
// ...
}
现在(在 Gradle 6 中),您可以在不使用构建脚本的情况下为插件指定仓库名称。 在 settings.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
这个链接是关于Gradle自定义插件仓库的文档。这不仅仅是处理插件的新方法,而且是改进构建过程和/或用户编辑体验的一种方式。这种向项目添加插件的方式不仅仅是更方便的语法。插件DSL以一种允许Gradle非常早和非常快地确定正在使用的插件的方式进行处理。这使得Gradle能够做出智能决策,例如:
优化加载和重用插件类。
为编辑器提供有关buildscript中潜在属性和值的详细信息,以获得编辑帮助。
这要求以一种Gradle可以轻松快速提取的方式指定插件,然后再执行其余的构建脚本。它还要求使用的插件定义相对静态。
2.) 有时候,你可能会有一个插件,需要在应用之前定义某些内容。在这种情况下,你可以在 plugins 块中声明一个插件,并推迟插件的应用,直到你定义了插件所需的输入内容。例如,我有一个自定义插件,它查找名为“mavenResource”的配置。在 dependencies 块中,我添加了一个依赖项,如:“mavenResource(maven_coordinate)”。该插件将查找 mavenResource 配置中包含的所有依赖项,并将相关的 maven artifact 复制到项目的“src/main/resources”目录中。正如你所看到的,我不想在添加 mavenResource 配置和定义 mavenResource 依赖项之前应用该插件。因此,我在 plugins 块中定义我的自定义插件,并在项目依赖项被定义后应用它。因此,认为应用插件是老式和错误的概念是一种误解。
有些人可能会想知道应用插件是什么意思。其实很简单,就是调用插件的 apply 函数并将 Gradle 项目对象传递给正在应用插件的项目。从那时起,插件所做的一切完全取决于插件本身。通常,apply 函数通常会创建一些 Gradle 任务并将它们添加到 Gradle 构建任务依赖图中。当 Gradle 开始执行阶段时,这些任务将在构建过程中的适当时间执行。插件 apply 函数还可以做一些事情,比如将一些工作推迟到 afterEvaluate 之后。这是一种允许构建脚本中的其他内容设置的方法,即使它们在 buildscript 中稍后定义也可以。那么,你可能会问为什么我没有在自定义插件中使用这个技巧。我观察到,在根项目完成评估后,下一个子项目开始处理。在我的情况下,我需要在下一个子项目开始之前添加资源。因此,存在竞争条件,我通过不使用 afterEvaluate 技术并在设置完成所需的内容后专门应用插件来避免了这种情况。settings.gradle(.kts)
文件进行标识),如下所示:pluginManagement {
includeBuild '<path-to-the-plugin-dir-containing-the-settings-file>'
}
pluginId
在plugins {}
DSL块中使用本地插件。pluginManagement
块中,而不是plugins
块中。plugins
块中,那么这种情况可能会发生。plugins {
id 'pl.allegro.tech.build.axion-release' version '1.10.3'
}
plugins {
id 'pl.allegro.tech.build.axion-release'
}
pluginManagement {
plugins {
id 'pl.allegro.tech.build.axion-release' version '1.10.3'
}
}
plugins {}
时不使用包名,而是使用完全限定的插件 ID。有关详细信息,请参阅 Gradle 文档 https://docs.gradle.org/current/userguide/custom_plugins.html#sec:creating_a_plugin_id - RenatoIvancic