应用gradle插件有什么不同

Yev*_*lik 139 groovy gradle gradle-plugin

我不明白gradle插件块

apply plugin: 'someplugin1'
apply plugin: 'maven'
Run Code Online (Sandbox Code Playgroud)

和其他一个:

plugins {
   id 'org.hidetake.ssh' version '1.1.2'
}
Run Code Online (Sandbox Code Playgroud)

在第一个块我们有一些插件名称.在第二个包和版本.我不明白我应该在哪里使用第一块和第二块.

cjs*_*hno 137

plugins块是应用插件的较新方法,它们必须在Gradle插件存储库中可用.该apply方法是一种更老,更灵活的方法,可以为您的构建添加插件.

plugins方法在多项目配置(subprojects,allprojects)中不起作用,但将适用于每个子项目的构建配置.

我认为随着功能的进步,plugins配置方法将超越旧方法,但此时两者都可以同时使用.

  • 2020年了,我还在使用`apply plugin` (15认同)
  • 这绝对是可怕的,两个指令具有完全不同的语法和输入,而且还不兼容。Gradle 是迄今为止使用 Java 和 Kotlin 时最大的痛点。 (15认同)
  • @Datz 从 Gradle 6 开始,您可以通过在 settings.gradle 中的pluginManagement 块中定义存储库来使用自己的自定义插件(甚至禁用官方 Gradle 插件存储库)。 (5认同)
  • 请记住,使用插件DSL(`plugins {...}`)应用插件不适用于您的私有插件或未发布到Gradle官方插件回购中的公司插件。这就是为什么我希望旧方法至少能够继续存在,直到新方法支持在私有存储库中进行搜索为止。 (4认同)
  • @Christian,Maven 是迄今为止使用 Java 时最大的痛点......而且我不知道它对 Kotlin 的支持。 (4认同)
  • 根据 Gradle 教程(Gradle 版本 5.6.2),“plugins”在多项目中工作:https://guides.gradle.org/creating-multi-project-builds/#add_documentation 它使用“plugins”块和“apply false” ` 将插件添加到整个项目,但不将其添加到根项目。子项目再次使用“plugins”块来添加插件。 (3认同)

Mou*_*usa 35

正如@cjstehno已经提到的那样apply plugin,你应该避免使用遗留方法.

随着插件DSL的引入,用户应该没有理由使用传统的应用插件的方法.这里记录的是,如果构建作者由于其当前工作方式的限制而无法使用插件DSL.

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

plugins {
    id «plugin id» version «plugin version» [apply «false»]
}
Run Code Online (Sandbox Code Playgroud)

在您想要在plugins块中应用已添加但未应用的插件的情况下,您仍将使用旧方法.例如,在主项目xyz中添加了插件但未应用插件,它应仅应用于子项目中subPro:

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

subprojects { subproject ->
    if (subproject.name == "subPro") {
        apply plugin: 'xyz'
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不再需要该版本.该版本是在需要的plugins块,除非你正在使用的核心摇篮插件之一,例如java,scala,...

在尝试创建Spring Boot应用程序时,我花了一些时间来理解差异,这就是为什么我会在一段时间后再次回答这个问题.以下使用Spring Boot插件的示例帮助了我很多:

目前应该使用什么:

plugins {
  id "org.springframework.boot" version "2.0.1.RELEASE"
}
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

  • 这在某种程度上给人一种错误的印象。不能简单地将 `apply plugin xxx` 转换为 `plugins { id xxx }` (我尝试过,但没有成功) (6认同)
  • 如果你想将“apply plugin”转换为“plugins { id xxx }”,你可能会在 https://plugins.gradle.org/ 找到你的插件,它会给你正确的“id”,这通常与与“apply plugin”一起使用的限定名称。 (2认同)

小智 18

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


道路apply plugin

首先在根build.gradle文件中解析您需要的插件。
例子:

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

然后在Gradle 模块的build.gradle中应用插件。
例子:

apply plugin: 'com.android.application'
apply plugin: 'com.google.dagger.hilt.android'
Run Code Online (Sandbox Code Playgroud)

道路plugins

将resolve 和apply 合并到根build.gradle文件中。
例子:

plugins {
    // other plugins...
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}
Run Code Online (Sandbox Code Playgroud)

然后在Gradle 模块的build.gradle中应用插件。
例子:

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

android {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在将我的 gradle 文件从旧的“应用插件”迁移到新的“插件 {}”方法,但在为给定的依赖项找到正确的 id 时遇到问题。有没有通用的方法?我目前正在堆栈实现依赖项: https://github.com/google/play-services-plugins/blob/master/oss-licenses-plugin/README.md 关于如何查找插件块的 id 有什么建议吗? (2认同)

Tom*_*hik 12

我将对已经说过的内容进行一些修改。Gradle 引入了插件块的概念,作为一种加速和优化构建过程的技术。Gradle 的文档是这样说的:

这种向项目添加插件的方式不仅仅是一种更方便的语法。插件 DSL 的处理方式允许 Gradle 非常早且非常快速地确定正在使用的插件。这使得 Gradle 可以做一些聪明的事情,例如:
优化插件类的加载和重用。
为编辑者提供有关构建脚本中潜在属性和值的详细信息,以获取编辑帮助。
这要求在执行构建脚本的其余部分之前,以 Gradle 可以轻松快速提取的方式指定插件。它还要求要使用的插件的定义在某种程度上是静态的。

它不仅仅是一种处理插件的新方法,也是一种改进构建过程和/或用户编辑体验的方法。

为了使其工作,需要在构建的顶部指定它,但如果包含的话,也需要在 buildscript 块之后指定。这是为什么?因为构建脚本中的代码是按照其编写的顺序进行评估的。必须在评估插件块之前评估构建脚本块。请记住,buildscript 块是关于设置插件环境的。因此,插件块必须在 buildscript 块之后指定的规则。

新的插件块不仅指定项目正在使用的插件,还指定是否应用该插件。默认情况下,plugins 块中的所有插件都会自动应用,除非特别声明不应用(即在plugins 块中的插件声明后添加“apply false”)。

那么为什么你要声明一个插件而不应用它呢?我能想到的主要原因有两个:

1.) 这样你就可以声明你想要使用的插件的版本。声明插件后,该插件现在位于“类路径”上。一旦插件位于类路径上,以后应用它时就不再需要指定插件的版本。在多项目构建中,这使得支持构建脚本变得更加容易。(即,您只有一处指定插件版本。)

2.) 有时,您可能有一个插件,需要在应用之前定义某些内容。在这种情况下,您可以在插件块中声明一个插件,并推迟应用该插件,直到定义该插件需要作为输入的内容之后。例如,我有一个自定义插件,它查找名为“mavenResource”的配置。在依赖项块中,我将添加一个依赖项,例如:“mavenResource( maven_coordinate )”。该插件将找到 mavenResource 配置中包含的所有依赖项,并将关联的 Maven 工件复制到项目的“src/main/resources”目录中。如您所见,在将 mavenResource 配置添加到该项目并定义 mavenResource 依赖项之前,我不想应用该插件。因此,我在插件块中定义了自定义插件,并在定义项目依赖项后应用它。因此,认为应用插件是旧式且错误的概念是一种误解。

有些人可能想知道应用插件意味着什么。这非常简单。这意味着您调用插件的 apply 函数,并将应用该插件的项目的 Gradle Project 对象传递给它。插件从那时起做什么完全由插件决定。最常见的是,apply 函数通常会创建一些 Gradle 任务并将它们添加到 Gradle 构建任务依赖关系图中。当 Gradle 开始执行阶段时,这些任务将在构建过程中的适当时间执行。插件 apply 函数还可以执行诸如将某些工作推迟到 afterEvaluate 之类的操作。这是一种允许在构建脚本中设置其他内容的方法,即使它们是稍后在构建脚本中定义的。所以,您可能会问为什么我不在我的自定义插件中执行此操作。我观察到,下一个子项目在根项目完成评估后开始处理。就我而言,我需要在下一个子项目开始之前添加资源。因此,存在一种竞争条件,我通过不执行 afterEvaluate 技术并在我需要的设置完成后专门应用该插件来避免这种情况。


Pun*_*unj 6

现在(在 Gradle 6 中)您可以在不使用构建脚本的情况下为插件指定存储库名称。在settings.gradle中,我们可以添加插件pluginManagement

pluginManagement {
    repositories {
        maven {
            url '../maven-repo'
        }
        gradlePluginPortal()
        ivy {
            url '../ivy-repo'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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