如何编写独立插件

要使用 java 创建自定义独立 Gradle 插件(你也可以使用 Groovy),你必须创建如下结构:

plugin
|-- build.gradle
|-- settings.gradle
|-- src
    |-- main
    |   |-- java
    |   |-- resources
    |       |-- META-INF
    |           |-- gradle-plugins
    |-- test

设置 gradle 配置

build.gradle 文件中,你可以定义项目。

apply plugin: 'java'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
} 

java 插件将用于编写 java 代码。
gradleApi() 依赖项将为我们提供创建 Gradle 插件所需的所有方法和属性。

settings.gradle 文件中:

rootProject.name = 'myplugin' 

它将在 Maven 中定义工件 ID
如果插件目录中不存在 settings.gradle 文件,则默认值将是目录的名称。

创建插件

在实现 Plugin 接口的 src/main/java/org/sample/MyPlugin.java 中定义一个类。

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class MyPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
         project.getTasks().create("myTask", MyTask.class);
    }

} 

定义扩展 DefaultTask 类的任务:

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;

public class MyTask extends DefaultTask {

    @TaskAction
    public void myTask() {
        System.out.println("Hello World");
    }
}

插件类声明

META-INF/gradle-plugins 文件夹中,你必须创建一个属性文件,用于定义标识插件实现类的 implementation-class 属性。

META-INF/gradle-plugins/testplugin.properties

implementation-class=org.sample.MyPlugin.java

请注意,属性文件名与插件 ID 匹配

如何构建和发布它

更改 build.gradle 文件,添加一些信息以在 maven 仓库中上传插件:

apply plugin: 'java'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
}

repositories {
    jcenter()
}

group = 'org.sample'
version = '1.0'

uploadArchives {
    repositories {
        mavenDeployer {
        repository(url: mavenLocal().url)
        }
    }
} 

你可以使用以下命令构建 Gradle 插件并将其发布到 plugin/build.gradle 文件中定义的 Maven 存储库。

$ ./gradlew clean uploadArchives 

如何使用它

要在项目的 build.gradle 中使用插件,请执行以下操作:

buildscript {
     repositories {
         mavenLocal()
     }
 dependencies {
    classpath group: 'org.sample',    // Defined in the build.gradle of the plugin
              name: 'myplugin',       // Defined by the rootProject.name 
              version: '1.0'
    }
 }

apply plugin: 'testplugin'            // Defined by the properties filename

然后你可以使用以下方法调用任务:

 $ ./gradlew myTask