如何将 Gradle 脚本插件变成二进制插件
How to turn a Gradle Script Plugin into a Binary Plugin
我有一堆 gradle 像这样的脚本插件 https://github.com/docToolchain/docToolchain/blob/master/scripts/exportExcel.gradle 并且想把它们变成 "real" 二进制插件以便于分发它们。
我知道我可以通过 http 从构建中引用脚本插件,但这不如真正的插件好。
如我所见,编写插件的一种方法是实现 org.gradle.api.Plugin
接口。这基本上意味着我将不得不重写所有 mit 脚本插件。
有没有其他方法可以轻松将它们变成二进制插件?也许是某种包装纸?
您的脚本似乎很容易转换为插件。
为什么说要重写脚本?据我所知,这基本上是修改一些小细节并添加所有 boilerplate/metadata 的问题。
我写了很多插件,这里有一个非常简单的:https://github.com/renatoathaydes/pony-gradle-plugin
这是制作真正的插件需要更改的内容:
- 为您最喜欢的 JVM 语言创建一个普通的 Gradle 项目。
- 在
buildScript
块中,添加 class 对 com.gradle.publish:plugin-publish-plugin:0.9.10
的路径依赖并应用 com.gradle.plugin-publish
插件。 Example.
- 添加对
gradleApi()
的编译依赖。 Example.
- 将
pluginBundle
配置添加到构建文件。 Example.
- 创建一个 class 实现
org.gradle.api.Plugin<org.gradle.api.Project>
接口。 Example.
- 在
apply
方法中配置插件(它为您提供 Project
的句柄)。这包括将您可能需要的任何任务添加到项目中。
- 为每个任务创建一个 class 扩展
org.gradle.api.DefaultTask
(通常)。 Example.
- 在某个方法中实现任务的逻辑,用
@org.gradle.api.tasks.TaskAction
注释该方法。 Example.
- 在
META-INF/gradle-plugins/plugin-name.properties
处创建一个描述符,其中的条目类似于 implementation-class=your.plugin.Class
。 Example.
基本上就是这样!
您可能希望使插件可配置,Gradle docs 展示了如何做到这一点,但为方便起见,这里是他们当前的示例:
class GreetingPluginExtension {
String message = 'Hello from GreetingPlugin'
}
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
// Add the 'greeting' extension object
def extension = project.extensions.create('greeting', GreetingPluginExtension)
// Add a task that uses configuration from the extension object
project.task('hello') {
doLast {
println extension.message
}
}
}
}
然后可以像这样在用户的构建文件中使用:
greeting {
message = 'Hi'
}
要在 Gradle 门户中实际发布插件,您需要创建一个帐户...see this 了解更多详细信息。 (或者你可以只在 Bintray 上发布它,但是你的用户在应用你的插件时会有点尴尬 - 另一方面 Bintray 作为存储库要好得多,所以我最终做了这两个,见上面的例子)。
我有一堆 gradle 像这样的脚本插件 https://github.com/docToolchain/docToolchain/blob/master/scripts/exportExcel.gradle 并且想把它们变成 "real" 二进制插件以便于分发它们。
我知道我可以通过 http 从构建中引用脚本插件,但这不如真正的插件好。
如我所见,编写插件的一种方法是实现 org.gradle.api.Plugin
接口。这基本上意味着我将不得不重写所有 mit 脚本插件。
有没有其他方法可以轻松将它们变成二进制插件?也许是某种包装纸?
您的脚本似乎很容易转换为插件。
为什么说要重写脚本?据我所知,这基本上是修改一些小细节并添加所有 boilerplate/metadata 的问题。
我写了很多插件,这里有一个非常简单的:https://github.com/renatoathaydes/pony-gradle-plugin
这是制作真正的插件需要更改的内容:
- 为您最喜欢的 JVM 语言创建一个普通的 Gradle 项目。
- 在
buildScript
块中,添加 class 对com.gradle.publish:plugin-publish-plugin:0.9.10
的路径依赖并应用com.gradle.plugin-publish
插件。 Example. - 添加对
gradleApi()
的编译依赖。 Example. - 将
pluginBundle
配置添加到构建文件。 Example. - 创建一个 class 实现
org.gradle.api.Plugin<org.gradle.api.Project>
接口。 Example. - 在
apply
方法中配置插件(它为您提供Project
的句柄)。这包括将您可能需要的任何任务添加到项目中。 - 为每个任务创建一个 class 扩展
org.gradle.api.DefaultTask
(通常)。 Example. - 在某个方法中实现任务的逻辑,用
@org.gradle.api.tasks.TaskAction
注释该方法。 Example. - 在
META-INF/gradle-plugins/plugin-name.properties
处创建一个描述符,其中的条目类似于implementation-class=your.plugin.Class
。 Example.
基本上就是这样!
您可能希望使插件可配置,Gradle docs 展示了如何做到这一点,但为方便起见,这里是他们当前的示例:
class GreetingPluginExtension {
String message = 'Hello from GreetingPlugin'
}
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
// Add the 'greeting' extension object
def extension = project.extensions.create('greeting', GreetingPluginExtension)
// Add a task that uses configuration from the extension object
project.task('hello') {
doLast {
println extension.message
}
}
}
}
然后可以像这样在用户的构建文件中使用:
greeting {
message = 'Hi'
}
要在 Gradle 门户中实际发布插件,您需要创建一个帐户...see this 了解更多详细信息。 (或者你可以只在 Bintray 上发布它,但是你的用户在应用你的插件时会有点尴尬 - 另一方面 Bintray 作为存储库要好得多,所以我最终做了这两个,见上面的例子)。