我为我需要的一些功能开发了一个自定义 Gradle
<Project>
插件。这是一个插件,因为我不想让代码弄乱我的 build.gradle
。它仅针对一个项目,因此我对发布或共享它不感兴趣。我希望该插件(仅)本地存在于我的项目的 buildSrc
目录层次结构中,并从那里调用。
现在,尽管我遵循了所有约定,但无法应用该插件,因为它从未找到。
Plugin [id: 'com.smotricz.myPlugin'] was not found in any of the following sources:
我的插件是一个类,所以它(当然)有一个限定的类名。但是 Gradle 在其插件语法中要求提供 ID,这并不相同。为我的插件指定“正确”的 ID 是否可以使其可访问?我如何发现 ID 或将 ID 附加到我的插件代码中?
遗憾的是,这些解决方案(我发现了 2 个)并不在我拥有的任何一本(本来很棒的)Gradle 书籍中。
我发现这个非常隐藏在 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
。
我在对这个答案进行事实核查时发现了这一点。如果您将链接编码为
buildSrc/build.gradle
,也许根本没有必要创建 META-INF 文件。这又来自 Gradle 的在线文档:
从 buildSrc 目录应用插件
您可以应用驻留在项目的 buildSrc 目录中的插件,如下所示 只要他们有一个定义的 ID。下面的例子展示了如何绑定 插件实现类 —
— 在my.MyPlugin
中定义 ID“buildSrc
”: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。