build.gradle
中创建的插件将被自动编译并包含在 classpath 中,使用时无需在构建脚本内指定 classpath
缺点:
- 此插件仅在当前构建脚本中有效,对外部文件不可见,无法在当前构建脚本以外的其他地方复用此插件
示例
1. 创建 BuildInDemo
目录
mkdir BuildInDemo
2. 在 BuildInDemo
目录内中新建 build.gradle
文件
cd BuildInDemo
touch build.gradle
使用 tree
命令查看创建后的目录结构,如下所示
BuildInDemo
.
└── build.gradle
0 directories, 1 file
3. 在 BuildInDemo/build.gradle
内创建并应用 Gradle 插件,代码如下
// 1. 创建插件 BuildInPlugin
class BuildInPlugin implements Plugin {
// 2. 应用插件时执行此函数
@Override void apply(Project target) {
println(“hello form build-in plugin”)
}
}
//3. 应用插件
apply plugin: BuildInPlugin
// 2. 应用插件时执行此函数
@Override void apply(Project target) {
println(“hello form build-in plugin”)
}
}
//3. 应用插件
apply plugin: BuildInPlugin
4. 构建此 build.gradle
文件
gradle build
Gradle 构建时将执行 build.gradle
中的代码,当执行到 apply plugin: BuildInPlugin
时,将会调用 BuildInPlugin 的实例方法 apply(Project p)
。因此在构建过程中,可以看到如下输出,其中第 2 行即为上一步自定义插件中打印的内容,表明插件应用成功
Configure project :
hello form build-in plugin
Task :buildEnvironment
Root project
classpath
No dependencies
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
buildSrc 模块方式
rootProject/buildSrc 文件夹是 Gradle 的预留目录,用来存放当前项目私有 Gradle 插件的源代码与构建脚本
优点:
-
项目构建时,Gradle 会自动编译项目目录下的 buildSrc 文件夹下的构建脚本和源码,并将其添加到项目构建脚本的 classpath 中,因此在使用 buildSrc 中创建的插件时,无需再手动指定 classpath
-
buildSrc 文件夹中构建脚本和 Gradle 插件同一项目均可见,因此同一项目中的其他模块也可以使用 buildSrc 中创建的插件
缺点:
- 此处创建的插件对外部项目不可见,无法在其他项目中复用
示例
1. 创建 PluginBuildSrcDemo
项目模块
创建 PluginBuildSrcDemo
目录,并在该目录下创建 build.gradle
文件
mkdir PluginBuildSrcDemo && cd PluginBuildSrcDemo && touch build.gradle
2. 创建 buildSrc
子模块
2.1 在 PluginBuildSrcDemo
目录下创建 buildSrc
目录
mkdir buildSrc
2.2 在 PluginBuildSrcDemo/buildSrc
目录下创建 buildSrc 子模块的构建脚本文件 build.gradle
cd buildSrc
touch build.gradle
PluginBuildSrcDemo/buildSrc/build.gradle
的内容如下
// 使用 plugins 块语法应用插件
plugins {
// 应用 kotlin 插件
id ‘org.jetbrains.kotlin.jvm’ version ‘1.3.50’
}
dependencies {
// 仅在编译时使用 Grdale-API 依赖
compileOnly gradleApi()
// 在插件源码中添加 kotlin 标准库依赖
implementation ‘org.jetbrains.kotlin:kotlin-stdlib’
}
2.3 创建 buildSrc 模块的源码目录
cd PluginBuildSrcDemo/buildSrc
mkdir -p /src/main/kotlin/com/example/plugin
2.4 创建插件文件 PluginBuildSrc.kt
cd PluginBuildSrcDemo/buildSrc/src/main/kotlin/com/example/plugin
touch PluginBuildSrc.kt
PluginBuildSrc.kt
的代码如下
package com.example.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class PluginBuildSrc : Plugin {
override fun apply(target: Project) {
println(“hello from buildSrc plugin”)
}
}
2.5 声明 Gradle 插件的 ID 与实现类
此步骤是可选的:若使用插件 ID 形式应用自定义插件,则必须进行此步骤;若使用插件实现类的形式应用自定义插件,则可跳过此步骤。
完成此步骤的方式有两种,任选其一即可
方式 1. META-INF 方式
创建 PluginBuildSrcDemo/buildSrc/src/main/resources/META-INF/gradle-plugins
目录
cd PluginBuildSrcDemo/buildSrc
mkdir -p src/main/resources/META-INF/gradle-plugins
在 gradle-plugins
目录下创建 com.example.plugin.properties 属性文件,红色部分表示插件的 ID
cd src/main/resources/META-INF/gradle-plugins
touch com.example.plugin.properties
属性文件的内容如下,表示插件 ID 为 com.example.plugin 的插件所对应的实现类为 com.example.plugin.PluginBuildSrc
implementations-class=com.example.plugin.PluginBuildSrc
方式 2. java-gradle-plugin 插件方式
java-gradle-plugin 是一个用于开发 Gradle 插件的辅助插件,它内置了很多辅助功能:
-
为宿主模块添加
gradlePlugin
配置块,可在此处配置插件的 ID 和实现类 -
为宿主模块添加
complile gradleApi()
依赖 -
etc…
此处我们主要使用 gradlePlugin
配置块代替 META-INF
目录下的属性文件。java-gradle-plugin
的使用方式非常简单,只需在 PluginBuildSrcDemo/buildSrc/build.gradle
构建脚本文件中简单配置即可,如下所示。
plugins {
id ‘org.jetbrains.kotlin.jvm’ version ‘1.3.50’
-
//1. 应用 java-gradle-plugin 插件
-
id 'java-gradle-plugin'
}
dependencies {
-
compileOnly gradleApi() // java-gradle-plugin 插件已为宿主添加 gradleApi 依赖,此行可移除
implementation ‘org.jetbrains.kotlin:kotlin-stdlib’
}
-
//2. 添加 gradlePlugin 配置块信息
-
gradlePlugin {
-
plugins{
-
// 此处的 tag 可以为任意名称
-
tag1{
-
id = 'com.example.plugin.buildsrc' //自定义插件的 ID
-
implementationClass = 'com.example.plugin.PluginBuildSrc' //自定义插件的实现类
-
}
-
}
-
}
此时在 PluginBuildSrcDemo 目录下使用 tree
命令,可以看到当前的目录结构如下
PluginBuildSrcDemo
.
├── build.gradle
├── buildSrc
│ ├── build.gradle
│ └── src
│ └── main
│ └── kotlin
│ └── com
│ └── example
│ └── plugin
│ └── PluginBuildSrc.kt
7 directories, 3 files
3. 在 PruginBuildSrcDemo
项目模块中应用 buildSrc
中声明的 Gradle 插件
在 PluginBuildSrcDemo/build.gradle
构建脚本文件中添加如下代码
//apply plugin: ‘插件 ID’
apply plugin: ‘com.example.plugin’
//apply plugin: 实现类
//apply plugin: com.example.plugin.PluginBuildSrc
应用插件时,指定插件 ID 或指定插件的实现类都可以,但指定插件 ID 的形式更为简短及灵活,在实际开发中也更为常见。
在 PluginBuildSrcDemo
目录下执行 gradle build
命令进行构建,可看到如下输出
Configure project :
hello from buildSrc plugin
Task :buildEnvironment
Root project
classpath
No dependencies
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed
其中第 2 行是我们在 buildSrc 模块中定义的 Gradle 插件所打印日志,表明 buildSrc 模块 中的自定义插件在根项目中已生效。
4. 创建 SubModule
子模块
buildSrc 模块中定义的插件可以在同一项目的任意模块的构建脚本中使用,接下来便演示在 SubModule 子模块中的应用。
4.1 创建 SubModule 目录与构建脚本
// 1. 在 PluginBuildSrcDemo 目录下创建 SubModule 目录
cd PluginBuildSrcDemo && mkdir SubModule
// 2. 在 SubModule 目录下新建 gradle 构建脚本
cd SubModule
touch build.gralde
PluginBuildSrcDemo/SubModule/build.gradle
的内容如下
apply plugin: ‘com.example.plugin’
4.2 将 SubModule 模块关联到 PluginBuildSrcDemo 项目中
在 PluginBuildSrcDemo
目录下新建 settings.gradle
文件,内容如下
// 将SubModule 子模块添加到 PluginBuildSrcDemo 项目模块中
include ‘:SubModule’
此时在 PluginBuildSrcDemo
目录下使用 tree
命令,可以看到项目当前的目录结构如下
PluginBuildSrcDemo
.
├── SubModule
│ └── build.gradle
├── build.gradle
├── buildSrc
│ ├── build.gradle
│ └── src
│ └── main
│ └── kotlin
│ └── com
│ └── example
│ └── plugin
│ └── PluginBuildSrc.kt
└── settings.gradle
5. 在 SubModule
模块执行构建命令
cd PluginBuildSrcDemo/SubModule
gradle build
得到如下输出
Configure project :SubModule
hello from buildSrc plugin
Task :SubModule:buildEnvironment
Project :SubModule
classpath
No dependencies
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
独立项目方式
采用 buildSrc 模块方式时,Gradle 会妥善处理 buildSrc 模块的构建脚本与源码,并将其添加到当前项目的 classpath 中。但 buildSrc 方式的插件只能在项目内共享与复用,若要在其他项目中使用该插件,还需要再进行下列操作
-
将插件发布到 maven 仓库(任意仓库)
-
在需要应用该插件的构建脚本中的 repository 部分添加该插件所在的 maven 仓库
-
在需要应用该插件的构建脚本中的 classpath 部分添加该插件对应的 maven 坐标 (group : id : version)
因为是在其他项目中使用该项目 buildSrc 模块 中的自定义 Gradle 插件,所以 Gradle 的 buildSrc 保留目录优势不再。如果将模块名由 buildSrc
修改为其他名称,则可将其称为独立的 Gradle 插件模块。
在本小节中,我们主要学习 gradle 插件的发布与使用。
1. 创建 gradle 插件项目
与 buildSrc 方式相同,先创建构建脚本与自定义插件类
mkdir StandaloneDemo
cd StandaloneDemo
touch build.gradle
mkdir src/main/kotlin/com/example/plugin
touch src/main/kotlin/com/example/plugin/StandalonePlugin.kt
StandaloneDemo/build.gradle
的内容如下
plugins {
id ‘org.jetbrains.kotlin.jvm’ version ‘1.3.50’
id ‘java-gradle-plugin’
}
gradlePlugin{
plugins{
sometag{
id = ‘com.example.plugin’
implementationClass = ‘com.example.plugin.StandalonePlugin’
}
}
}
StandaloneDemo/src/main/kotlin/com/example/plugin/StandalonePlugin.kt
的内容如下
package com.example.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class StandalonePlugin : Plugin {
override fun apply(target: Project) {
println(“hello from standalone plugin”)
}
}
2. 将 gradle 插件发布到 maven 仓库
2.1 在 StandaloneDemo/build.gradle
文件中配置发布信息
使用 maven-publish
插件将自定义插件发布到本地 maven 仓库中,如下所示
plugins {
id ‘org.jetbrains.kotlin.jvm’ version ‘1.3.50’
id ‘java-gradle-plugin’
-
//1. 应用 maven-publish 插件
-
id ‘maven-publish’
}
gradlePlugin{
plugins{
sometag{
id = ‘com.example.plugin’
implementationClass = ‘com.example.plugin.StandalonePlugin’
}
}
}
+//2. 设置发布相关配置
+publishing {
-
publications {
-
//3. 将插件发布到 maven 仓库
-
maven(MavenPublication) {
-
//4. 设置插件的 maven 坐标
-
groupId 'com.example'//组织 ID
-
artifactId 'plugin' //制品 ID
-
version 'snapshot' //制品版本
-
from components.kotlin
-
}
-
}
-
//5. 设置发布仓库
-
repositories {
-
// 6. 发布到本地 maven 仓库
-
mavenLocal()
-
}
+}
2.2 使用 publishMavenPublicationToMavenLocal
任务将插件发布到本地仓库
cd StandaloneDemo
gradle publishMavenPublicationToMavenLocal
执行以上命令后,gradle 会把 StandaloneDemo
中的代码编译打包后发布到本地 maven 仓库中,本地 maven 仓库通常存放于当前用户目录下,具体路径为
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
2.2 使用 publishMavenPublicationToMavenLocal
任务将插件发布到本地仓库
cd StandaloneDemo
gradle publishMavenPublicationToMavenLocal
执行以上命令后,gradle 会把 StandaloneDemo
中的代码编译打包后发布到本地 maven 仓库中,本地 maven 仓库通常存放于当前用户目录下,具体路径为
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-F5DtRcYX-1715904721539)]
[外链图片转存中…(img-GreQH3hn-1715904721540)]
[外链图片转存中…(img-powaBgcP-1715904721541)]
[外链图片转存中…(img-mLWnlNsJ-1715904721542)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!