自定义Plugin发布mavenLocal并使用

512 阅读1分钟

创建自定义Plugin

基于 gradle7.5

首先创建一个Android Project,然后创建Module,删除Module中不必要的目录,得到如下目录

image.png

配置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

这是因为找不到编译的java源代码,参考这里

怎么解决呢?

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工程如下

以kotlin编写的plugin

以java编写的plugin