1、前言
不管是在公司内部,还是开源,Gradle插件发布都是一项必备的技能,本文主要介绍本地发布和远端发布两种方式。
2、本地发布
2.1、添加依赖
在plugin>build.gradle文件中(插件的项目)先依赖一个maven发布的插件'maven-publish'
plugins {
id 'maven-publish'
}
dependencies {
implementation 'com.android.tools.build:gradle:7.3.0'
}
2.2、发布配置
maven的发布配置是在publishing { }
闭包中设置的。
本地发布主要为两部分:
- GAV坐标
- 仓库地址
group 'com.yechaoa.plugin'
version '1.0.0'
publishing {
// 配置Plugin GAV
publications {
maven(MavenPublication) {
groupId = group
artifactId = 'dependencies'
version = version
from components.java
}
}
// 配置仓库地址
repositories {
maven {
url layout.buildDirectory.dir("maven-repo")
}
}
}
2.3、执行发布
以上配置完成即可执行发布操作:
./gradlew publish
或者在Android Studio右边Gradle可视化的面板点击运行publish
:
2.4、生成产物
ok,这时候build文件夹下已经有本地发布配置的maven-repo
文件夹了。
主要确认jar/aar文件、pom文件、metadata等正确即可。
2.5、使用
ok,本地发布完了,要想使用这个插件,跟我们正常依赖插件是一样的流程。
三步走:
- 在settings.gradle文件中配置插件仓库地址
pluginManagement {
repositories {
// ...
maven {
url './maven-repo'
}
}
}
- 在project>build.gradle文件中添加插件依赖
buildscript {
dependencies {
classpath('com.yechaoa.plugin:dependencies:1.0.0')
}
}
- 在app:build.gradle文件中依赖我们的plugin
plugins {
id 'com.yechaoa.plugin.dependencies'
}
以上配置都是在app模块中添加的,即需要使用的模块。
注意:本地依赖使用的时候,要先发布,再依赖插件,否则就会出现
cannot found
找不到依赖的情况。
3、Maven远端发布
Maven是一个软件项目管理工具,基于项目对象模型 (POM) 的概念,Maven 可以通过中央信息来管理项目的构建、报告和文档,也是最常用的存储库。
上面我们已经完成了本地发布,Maven远端发布主要是需要各种配置。
基于本地发布,远端发布有几个差异点:
- 注册仓库账号;
- 配置POM;
- 签名;
- 远端仓库地址;
- 准备域名;
比较繁琐,就。。不全流程陪跑了
一个示例:
plugins {
id 'java-library'
id 'maven-publish'
id 'signing'
}
group = 'com.example'
version = '1.0'
java {
withJavadocJar()
withSourcesJar()
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = 'my-library'
from components.java
versionMapping {
usage('java-api') {
fromResolutionOf('runtimeClasspath')
}
usage('java-runtime') {
fromResolutionResult()
}
}
pom {
name = 'My Library'
description = 'A concise description of my library'
url = 'http://www.example.com/library'
properties = [
myProp: "value",
"prop.with.dots": "anotherValue"
]
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'johnd'
name = 'John Doe'
email = 'john.doe@example.com'
}
}
scm {
connection = 'scm:git:git://example.com/my-library.git'
developerConnection = 'scm:git:ssh://example.com/my-library.git'
url = 'http://example.com/my-library/'
}
}
}
}
repositories {
maven {
// change URLs to point to your repos, e.g. http://my.org/repo
def releasesRepoUrl = layout.buildDirectory.dir('repos/releases')
def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots')
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
}
}
}
signing {
sign publishing.publications.mavenJava
}
javadoc {
if(JavaVersion.current().isJava9Compatible()) {
options.addBooleanOption('html5', true)
}
}
全流程的大家可以参考:
- 再见JCenter,将你的开源库发布到MavenCentral上吧
- Gradle 构建工具 #4 来开源吧!发布开源组件到 MavenCentral 仓库超详细攻略
4、JitPack
如果你的项目是使用GitHub托管的,那么最常用的发布方式就是使用JitPack了,它是一个简单易用的Git包存储库,使用、发布也非常简单,不需要注册网站账号,搞一堆验证什么的,而且对项目也是无侵入式的,也不需要服务器、域名什么的。
4.1、使用GitHub托管
最基本的就是项目使用GitHub来进行托管了,就是把项目上传到GitHub,Public或者Private都行。
比如我这个GradleX项目:
4.2、发布
你甚至什么都没干,就传了一个项目,就可以直接走发布流程了。
在项目仓库主页的右边菜单列表,找到Releases,点击「Create a new release」。
如果已经发布过了,这里就是发布记录,点进去可以「Draft a new release」。
- 设置tag,即版本号,如果不是正式版,可以在后面加上alpha,比如1.0-alpha;
- 选择发布的分支;
- 发布标题;
- 发布描述;
- 点击「Publish release」进行发布;
发布完成会有产物和记录
4.3、使用
上面就发布完成了,那么如何使用呢?
打开Jitpack官网:https://www.jitpack.io/,在输入框里输入yechaoa/GradleX
,即username+project。
然后点击Look up
开始查找和构建。
构建完成有了Log日志之后,即可以点击Get it
获取使用方式。
使用方式:
- 首先要添加jitpack的仓库地址;
- 然后添加项目依赖,因为是基于GitHub发布的,域名前缀会com.github,自定义需要添加映射;
在添加依赖这里,因为我们是整个项目发布的,包含多个模块,所以我们也可以选择子模块来进行单独依赖。
比如我这个项目中有:
我的项目是GradleX,插件模块是plugin,插件是dependencies。根据最小原则,我们可以直接选择依赖插件dependencies,后面有多个插件的时候,我们可以选择依赖plugin模块。
4.4、验证
发布完了,我们来验证一把试试。
首先在settings.gradle中添加仓库:
repositories {
maven { url 'https://jitpack.io' }
}
然后再添加依赖:
dependencies {
classpath('com.github.yechaoa.GradleX:dependencies:1.0')
}
因为我们是依赖插件,所以implementation要换成classpath。
最后是依赖插件和打开插件配置:
plugins {
id 'com.yechaoa.plugin.dependencies'
}
printDependencies {
enable = true
}
然后我们sync一下看看。
> Configure project :app
DependenciesPlugin >>>>> com.yechaoa.plugin.DependenciesPlugin
---hasProperty isTest no
DependenciesPlugin >>>>> 已开启依赖打印
DependenciesPlugin >>>>> applicationVariant.getName() = debug
Run with --info for a stacktrace.
--------------官方库 start--------------
com.google.android.material:material:1.8.0
androidx.appcompat:appcompat:1.5.0
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10
androidx.core:core-ktx:1.8.0
......
可以看到,已经有预期的输出结果了。
因为sync会触发Gradle构建,从而我们在编译期打印依赖的插件就会生效,并打印项目中的依赖。
ok,jitpack的发布方式就这些了,是不是非常简单~
5、Gradle Plugin Portal
Gradle插件门户网站是一个专用于Gradle插件的集中式、可搜索的存储库,发布的流程和配置也都比Maven要简单多了。
5.1、注册账号
首先要注册一个Gradle插件门户网站的账号,https://plugins.gradle.org/user/login,我们直接使用Github账号登录即可。
GitHub执行2FA双重校验之后,使用GitHub登录时需要再校验一次,按照流程走就行,不复杂。
5.2、获取秘钥
在API Keys选项下面生成秘钥。
5.3、配置秘钥
秘钥用来发布用,通常是放在HOME_DIR/.gradle/gradle.properties (~/.gradle/gradle.properties)
文件中,如果没有,就新建一个。当然也可以放在其他有效的地方,但我还是建议放在这,可以全局用。
如果这一步你没有配置,也可以手动执行发布命令,然后通过传参的方式把秘钥给带上去:
$ ./gradlew publishPlugins -Pgradle.publish.key=<key> -Pgradle.publish.secret=<secret>
5.4、发布配置
5.4.1、依赖发布插件
gradle插件门户发布的话有自己的发布插件
plugins {
id 'com.gradle.plugin-publish' version '1.1.0'
}
发布插件1.0.0版本及以上的用法,需要Gradle 7.6及以上。
不过1.0.0版本及以上版本也带来了诸多便利,比如:
- 它包含’java-gradle-plugin’和’maven-publish’插件;
- 自动生成并发布源码和文档;
- 签名也是自动的;
5.4.2、配置发布信息
因为我们前面本地发布的时候依赖过id 'java-gradle-plugin'
插件了,这里就省事了,直接在gradlePlugin { } 里面继续配置就行。
gradlePlugin {
// 项目地址
website = 'https://github.com/yechaoa/GradleX'
// 项目仓库URI
vcsUrl = 'https://github.com/yechaoa/GradleX.git'
// 可以有多个plugin配置
plugins {
// register 这个名字可以随便填
register {
// 插件id
id = 'com.yechaoa.plugin.dependencies'
// 插件全路径
implementationClass = "com.yechaoa.plugin.DependenciesPlugin"
// 插件名称
displayName = 'DependenciesPlugin'
// 描述、简介
description = 'Show Dependencies Plugin'
// 插件类别,即标签、关键词的意思
tags.addAll('Dependencies', 'yechaoa', 'plugin')
}
}
}
以上配置需要Gradle7.6版本及以上,老的版本用的是pluginBundle
,而不是gradlePlugin
。
@since 7.6:
/**
* Returns the property holding the URL for the plugin's website.
*
* @since 7.6
*/
@Incubating
public Property<String> getWebsite() {
return website;
}
发布后的示例:
5.5、执行发布
以上配置完成之后,sync一下。
发布命令:
./gradlew publishPlugins
没配秘钥的话:
./gradlew publishPlugins -Pgradle.publish.key=<key> -Pgradle.publish.secret=<secret>
或者在Gradle面板中双击publishPlugins执行:
接下来就是等待审核了。审核是有一些要求的,比如太简单且没有意义的helle word
、SNAPSHOT
版本等。
审核通过就可以在Gradle插件门户网站搜到了。
5.6、引用方式
7.0之后:
plugins {
id "com.yechaoa.plugin.dependencies" version "1.0.0"
}
7.0之前:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.yechaoa.plugin:dependencies:1.0.0"
}
}
apply plugin: "com.yechaoa.plugin.dependencies"
7.0之后因为在pluginManagement{ }
中默认加了gradlePluginPortal()
地址,所以配置更简单了。
7、总结
Gradle插件发布就介绍到这里了,虽然maven的发布方式很繁琐,但也只是第一次这样,配置完成后就可以抽成一个脚本,每次发布执行一下就ok了,不过还是首推JitPack,毕竟真的太方便了。
8、最后
写作不易,感谢支持~
9、GitHub
https://github.com/yechaoa/GradleX
10、相关文档
- Apache Maven
- Publishing a project as module
- Maven Publish Plugin
- POM Reference
- MavenPom
- jitpack.io
- Publishing Plugins to the Gradle Plugin Portal
- How do I publish my plugin to the Plugin Portal using version 1.0+?