创建自定义Plugin
基于 gradle7.5
首先创建一个Android Project,然后创建Module,删除Module中不必要的目录,得到如下目录
配置build.gradle
可参考官方文档 custom_plugins_standalone_project
plugins {
id 'java-gradle-plugin'
}
gradlePlugin {
plugins {
simplePlugin {
id = 'standalone-plugin'
implementationClass = 'com.example.plugin.GreetingPlugin'
}
}
}
此时,sync project,如果你也是用kotlin语言实现了GreetingPlugin,你会在Terminal中看到第一个错误
Task :plugin:compileJava NO-SOURCE
怎么解决呢?
1.kotlin代码首先需要kotlin plugin编译
2.指定编译源代码的路径
在builder.gradle中添加如下代码:
plugins {
id 'java-gradle-plugin'
id 'org.jetbrains.kotlin.jvm'
}
配置mavenPublish
sync Project,build完成后,我们的standalone-plugin作为一个project就配置完成了,接下来就可以发布了。 发布可参考官方文档
或者在上面build.gradle的基础上添加
plugins {
id 'maven-publish'
}
group = 'com.example.plugin'
version = '1.1'
publishing {
publications {
maven(MavenPublication) {
artifactId = 'standalone-plugin'
from components.java
}
}
repositories {
mavenLocal()
}
}
完整的build.gradle
plugins {
id 'java-gradle-plugin'
id 'maven-publish'
id 'org.jetbrains.kotlin.jvm'
}
gradlePlugin {
plugins {
standaloneGradlePlugins {
id = 'standalone-plugin'
implementationClass = 'com.example.plugin.GreetingPlugin'
}
}
}
group = 'com.example.plugin'
version = '1.1'
publishing {
publications {
maven(MavenPublication) {
artifactId = 'standalone-plugin'
from components.java
}
}
repositories {
mavenLocal()
}
}
使用自定义Plugin
接下来就是使用我们发布到mavenLocal上的plugin,由于我们指定了我们发布的repositories为mavenLocal(),所以plugin.jar会在/user/.m2/repositories中
当我们按照官方文档,在setting.gradle中添加了mavenLocal()
pluginManagement {
repositories {
mavenLocal()
google()
mavenCentral()
gradlePluginPortal()
}
}
在app的build.gradle中的plugins{}中使用时
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'standalone-plugin' version '1.1'
}
就会发生找不到对应的plugin的错误
这时需要在setting.gradle中添加
resolutionStrategy {
eachPlugin {
println("resolutionStrategy eachPlugin ${requested.id.namespace}")
if (requested.id.namespace == 'com.example.plugin') {
useModule("com.example.plugin:standalone-plugin:${requested.version}")
}
}
}
然后使用即可。
以上,只有在编写的plugin文件为kotlin语言时需要如此设置,如果GreetingPlugin类为java文件,则不需要如此设置。
Github demo工程如下