一、Gradle 基础
二、Gradle 构建
三、Task 编写和使用
四、Plugin 编写和使用
四、Plugin 编写和使用
4.1 构建逻辑的复用
许多 Gradle
特性,例如编译 Java
代码,都是由插件赋能的。插件可以添加新任务(例如,JavaCompile
)、领域对象(例如,SourceSet
)、约定(例如,Java
源代码位置),并且扩展核心对象或者来自其他插件的对象。应用插件于项目后,插件可以扩展项目和 Gradle
的功能。
插件可以以下面三种方式获取:
- Core plugins - Gradle develops and maintains a set of Core Plugins.
- Community plugins - Gradle plugins shared in a remote repository such as Maven or the Gradle Plugin Portal.
- Local plugins - Gradle enables users to create custom plugins using APIs.
插件分为两种类型:binary plugins 和script plugins。
- Binary plugins 要么通过实现
Plugin
接口以编程方式编写,要么通过Groovy
或Kotlin DSL
中的声明编写。它们可以驻留在构建脚本、项目层次结构中,也可以驻留在外部的插件jar
中。 - 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 自定义插件
buildSrc
是Gradle
项目根目录中的一个可选目录,其中包含用于构建主项目的构建逻辑(即插件)。
文件结构:
├── 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