如何识别我的 Gradle 自定义插件?

问题描述 投票:0回答:1

我为我需要的一些功能开发了一个自定义 Gradle

<Project>
插件。这是一个插件,因为我不想让代码弄乱我的
build.gradle
。它仅针对一个项目,因此我对发布或共享它不感兴趣。我希望该插件(仅)本地存在于我的项目的
buildSrc
目录层次结构中,并从那里调用。

现在,尽管我遵循了所有约定,但无法应用该插件,因为它从未找到。

Plugin [id: 'com.smotricz.myPlugin'] was not found in any of the following sources:

我的插件是一个类,所以它(当然)有一个限定的类名。但是 Gradle 在其插件语法中要求提供 ID,这并不相同。为我的插件指定“正确”的 ID 是否可以使其可访问?我如何发现 ID 或将 ID 附加到我的插件代码中?

gradle gradle-plugin
1个回答
0
投票

遗憾的是,这些解决方案(我发现了 2 个)并不在我拥有的任何一本(本来很棒的)Gradle 书籍中。

解决方案1

我发现这个非常隐藏在 Gradle 的在线文档中

幕后花絮

那么Gradle是如何找到Plugin实现的呢?答案是——你 需要在 JAR 的 META-INF/gradle-plugins 中提供属性文件 与你的插件 id 匹配的目录,由 Java 处理 Gradle Plugin 开发插件。

示例:自定义插件的接线

给定一个带有 ID

org.example.greeting
和实现类的插件
org.example.GreetingPlugin

src/main/resources/META-INF/gradle-plugins/org.example.greeting.properties

implementation-class=org.example.GreetingPlugin

请注意,属性文件名与插件 ID 匹配,并且是 放置在资源文件夹中,并且实现类 属性标识插件实现类。

我遵循了这个建议,创建了一个指定我的实现类(

myPlugin.properties
)的
com.smotricz.MyPlugin
文件,然后能够在我的项目的
build.gradle
中以通常的方式应用我的插件:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.9.0' // unrelated
    id 'myPlugin'
}

...我现在可以从我的

Task
中的插件访问
Action
build.gradle

解决方案2

我在对这个答案进行事实核查时发现了这一点。如果您将链接编码为

buildSrc/build.gradle
,也许根本没有必要创建 META-INF 文件。这又来自 Gradle 的在线文档

从 buildSrc 目录应用插件

您可以应用驻留在项目的 buildSrc 目录中的插件,如下所示 只要他们有一个定义的 ID。下面的例子展示了如何绑定 插件实现类 —

my.MyPlugin
— 在
buildSrc
中定义 ID“
my-plugin
”:

示例 4. 使用 ID 定义 buildSrc 插件

buildSrc/build.gradle

plugins {
    id 'java-gradle-plugin' 
}

gradlePlugin {
    plugins {
        myPlugins {
            id = 'my-plugin'
            implementationClass = 'my.MyPlugin'
        }
    }
}

更新:我在 2023 年 10 月 25 日尝试过这个(“解决方案 2”),但无法让它工作。所以我坚持使用解决方案 1。

© www.soinside.com 2019 - 2024. All rights reserved.