Gradle应用插件 vs 插件

12
我有一个简单的插件,其中包含一个名为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
        }
    }
}

现在,我有一个运行应用程序只需运行“问候任务”。
buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'standalone.plugin2.greeting:standalone-plugin2:1.0'
    }
}

apply plugin: 'standalone.plugin2.greeting'

使用apply plugin的表示法可以正常工作,但是当我改用插件表示法时,就像这样:
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 是旧的,不应该使用。
1个回答

12
在引入{{插件}}块之前,插件依赖关系必须使用{{仓库}}和{{依赖项}}的组合方式解决,就像常规项目依赖关系一样。由于它们需要在运行实际构建脚本之前解决,因此需要在特殊的{{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插件仓库中解析插件。这是一个常规的Maven仓库,因此也可以使用旧的方法:

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

在您的情况下,插件仅存在于mavenLocal中,因此plugins块无法解析它,因为它只查找Gradle中央插件存储库。 您可以使用pluginManagement从自定义存储库解析插件
如上面链接的文章所述,有必要创建插件标识符(在plugins块内使用)和提供相应插件的Maven坐标之间的链接。 为了创建此链接,必须发布遵循特定约定的标记工件。 Gradle Plugin Development PluginMaven Publish Plugin结合使用时会自动发布此标记工件。

我在 settings.gradle 中创建了一个 pluginManagement,现在我的插件已经被解析,但是任务 greet 找不到。我想我还是继续使用 apply plugin - JiKra
请问您能否详细说明如何正确声明mavenLocal()仓库,以便在插件部分解析插件?我遇到了同样的问题,但无法通过pluginManagement解决。 - Sasha Shpota
@SashaShpota,你能否创建另一个问题,包含你尝试过的代码和遇到的问题? - Lukas Körfer
@SashaShpota 实际上猜测一下:您是否在插件项目中使用 java-gradle-plugin 插件?如果没有,您需要手动发布插件标记工件以创建插件标识符(在 plugins 块内使用)和应从 Maven 存储库解析的实际工件之间的链接。 - Lukas Körfer
@mashasha,创建“install”任务的“maven”插件已被弃用,不应再使用。请改用“maven-publish”插件,因为它将由“java-gradle-plugin”插件进行配置。然后,您可以调用“gradle publishToMavenLocal”来发布您的插件,它应该会自动发布标记工件。如果遇到任何其他问题,请提出新问题。 - Lukas Körfer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接