Gradle 应用插件 vs 插件

Gradle apply plugin vs plugins

我有一个简单的插件,其中 greet 任务执行一些 'Hello World' 打印。

plugins {
    id 'java-gradle-plugin'
    id 'groovy'
    id 'maven-publish'
}

group = 'standalone.plugin2.greeting'
version = '1.0'

gradlePlugin {
    plugins {
        greeting {
            id = 'standalone.plugin2.greeting'
            implementationClass = 'standalone.plugin2.StandalonePlugin2Plugin'    
        }
    }
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'standalone.plugin2.greeting'
            version = '1.0'
            from components.java
        }
    }
}

现在,我有 运行ner 申请 运行 greet task

buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'standalone.plugin2.greeting:standalone-plugin2:1.0'
    }
}

apply plugin: 'standalone.plugin2.greeting'

使用 apply plugin natation 可以正常工作,但是当我使用插件符号而不是这样时:

plugins {
    id 'standalone.plugin2.greeting' version '1.0'
}

没用。

错误信息是:

* What went wrong:
Plugin [id: 'standalone.plugin2.greeting', version: '1.0'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'standalone.plugin2.greeting:standalone.plugin2.greeting.gradle.plugin:1.0')
  Searched in the following repositories:
    Gradle Central Plugin Repository

有什么区别?根据文档 apply plugin 是旧的,不应使用。

在引入 plugins 块之前,必须使用 repositoriesdependencies 的组合以与常规项目依赖项相同的方式解决插件依赖项。由于它们需要在 运行 实际构建脚本之前解决,因此需要在特殊的 buildscript 块中定义它们:

buildscript {
    repositories {
        // define repositories for build script dependencies
    }
    dependencies {
        // define build script dependencies (a.k.a. plugins)
    }
}

repositories {
    // define repositories for regular project dependencies
}

dependencies {
    // define regular project dependencies
}

解决依赖关系后,可以使用 apply plugin: 应用它们。

默认情况下,新的 plugins 块只解析来自 Gradle Plugin Repository 的插件。这是一个常规的 Maven 存储库,因此也可以使用旧方法:

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
}

在您的情况下,该插件仅存在于 mavenLocal 中,因此 plugins 块无法解析它,因为它只查看 Gradle 中央插件存储库。您可以使用 pluginManagement 块来 resolve plugins from custom repositories

如上文 linked 所述,有必要在插件标识符(在 plugins 块内使用)和提供的 Maven 坐标之间创建一个 link相应的插件。要创建此 link,必须发布遵循特定约定的标记工件。 Gradle Plugin Development Plugin automatically publishes this marker artifact if used in combination with the Maven Publish Plugin.