四、Plugin 编写和使用

一、Gradle 基础
二、Gradle 构建
三、Task 编写和使用
四、Plugin 编写和使用


四、Plugin 编写和使用

4.1 构建逻辑的复用

许多 Gradle 特性,例如编译 Java 代码,都是由插件赋能的。插件可以添加新任务(例如,JavaCompile)、领域对象(例如,SourceSet)、约定(例如,Java 源代码位置),并且扩展核心对象或者来自其他插件的对象。应用插件于项目后,插件可以扩展项目和 Gradle 的功能。

插件可以以下面三种方式获取:

  1. Core plugins - Gradle develops and maintains a set of Core Plugins.
  2. Community plugins - Gradle plugins shared in a remote repository such as Maven or the Gradle Plugin Portal.
  3. Local plugins - Gradle enables users to create custom plugins using APIs.

插件分为两种类型:binary plugins 和script plugins。

  1. Binary plugins 要么通过实现Plugin接口以编程方式编写,要么通过GroovyKotlin DSL中的声明编写。它们可以驻留在构建脚本、项目层次结构中,也可以驻留在外部的插件jar中。
  2. Script plugins 是进一步配置构建的附加构建脚本。Script plugins通常以一种声明性方法以实现自定义构建项目。它们通常在构建中使用,但可以提供外部使用,实现远程访问。

4.2 简单插件

// /build.gradle
// 1. 项目内定义插件
class MyPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        (0..11).each { i ->
            project.tasks.register("PluginDynamicallyCreatedTask_" + i) {
                group = "PluginDynamicallyCreatedTask"
                description = "plugin dynamically created tasks"
                def taskName = it.name
                doLast {
                    println("do last executing " + taskName)
                }

                println("configuration ${taskName}")
            }
        }
    }
}

apply plugin: MyPlugin // 等价于 apply([plugin:MyPlugin])

创建实现 Plugin的类,重写apply方法。然后使用 apply plugin运用插件。

C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew PluginDynamicallyCreatedTask_1                                                                     

> Configure project :app
Hello World Configuring
configuration PluginDynamicallyCreatedTask_1

> Task :PluginDynamicallyCreatedTask_1
do last executing PluginDynamicallyCreatedTask_1

BUILD SUCCESSFUL in 639ms
3 actionable tasks: 1 executed, 2 up-to-date

4.3 script plugin

可以从本地文件系统或者http url地址解析脚本文件导入插件。

// myPlugin.gradle 文件
public class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        (0..10).each { i ->
            project.tasks.register("MyPluginDynamicallyCreatedTask_" + i) {
                group = "MyPluginDynamicallyCreatedTask"
                description = "my plugin dynamically created tasks"
                def taskName = it.name
                doLast {
                    println("do last executing " + taskName)
                }

                println("configuration ${taskName}")
            }
        }
    }
}

apply plugin: MyPlugin

// build.gradle 文件
apply from:'myPlugins.gradle'


执行结果:

C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew MyPluginDynamicallyCreatedTask_1                                                                   

> Configure project :app
Hello World Configuring
configuration MyPluginDynamicallyCreatedTask_1

> Task :MyPluginDynamicallyCreatedTask_1
do last executing MyPluginDynamicallyCreatedTask_1

BUILD SUCCESSFUL in 657ms
3 actionable tasks: 1 executed, 2 up-to-date

4.4 buildSrc 自定义插件

buildSrcGradle项目根目录中的一个可选目录,其中包含用于构建主项目的构建逻辑(即插件)。

文件结构:

├── build.gradle
├── buildSrc
   └── build.gradle
   └── src
      └── main
         └── java
            └── MyPluginBuildSrc.java

build.gradle

apply plugin: MyPluginBuildSrc

buildSrc/build.gradle

plugins {
    id "java"
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

buildSrc\src\main\java\MyPluginBuildSrc.java

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


public class MyPluginBuildSrc implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        for (int i = 0; i < 10; i++) {
            String pluginName = "MyPluginBuildSrc_" + i;
            MyPluginBuildSrcAction myPluginBuildSrcAction = new MyPluginBuildSrcAction(pluginName);
            Task task = project.task(pluginName, myPluginBuildSrcAction);
            task.doFirst(new MyPluginBuildSrcAction(pluginName + "_" + "doFirst"));
            task.doLast(new MyPluginBuildSrcAction(pluginName + "_" + "doLast"));
        }
    }
}

class MyPluginBuildSrcAction implements Action<Task> {
    private final String actionName;

    MyPluginBuildSrcAction(String actionName) {
        this.actionName = actionName;
    }

    @Override
    public void execute(Task task) {
        System.out.println("executing task: " + this.actionName);
    }
}

结果:

C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew MyPluginBuildSrc_1

> Configure project :
executing task: MyPluginBuildSrc_0
executing task: MyPluginBuildSrc_1
executing task: MyPluginBuildSrc_2
executing task: MyPluginBuildSrc_3
executing task: MyPluginBuildSrc_4
executing task: MyPluginBuildSrc_5
executing task: MyPluginBuildSrc_6
executing task: MyPluginBuildSrc_7
executing task: MyPluginBuildSrc_8
executing task: MyPluginBuildSrc_9

> Configure project :app
Hello World Configuring

> Task :MyPluginBuildSrc_1
executing task: MyPluginBuildSrc_1_doFirst
executing task: MyPluginBuildSrc_1_doLast

BUILD SUCCESSFUL in 660ms
3 actionable tasks: 1 executed, 2 up-to-date
  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值