最近更新了Gradle版本,然后就导致Android Studio 报错:
Plugin with id 'maven' not found
Plugin [id: 'maven'] was not found in any of the following sources
忘了具体是哪个错误了,反正就是类似的报错,maven被改成了maven-publish,这就造成了之前的发布脚本不能用了,由于之前那个一直用的很顺手,所以研究了一下,把思路拿过来。
之前的脚本是照搬:https://blog.csdn.net/ouyang_peng/article/details/56872556 配合自己的Maven仓库,非常方便。
大概思路就是:可通过简单的配置,发布不同的类型到不同的仓库,例如dev、beta、release,这样做的优点显而易见,版本互相隔离,dev版可以快速迭代,每次APP要发布正式版的时候,各个引用库只需要分别发一个release版,然后引用即可,对于版本迭代、回溯之类的非常方便。
找了一下maven-publish的相关文章,资料比较少,也并没有与之前思路一致的相关代码,没办法,自己凑吧。。。另外就是gradle官方的文档太繁琐了,我只是想知道怎么用,不想增加技能点,可能就几行代码,但是要去读那么老长的文档。。。本末倒置啊。。
找到两篇文章比较有用:
https://blog.csdn.net/qq_37455727/article/details/119778435
https://blog.csdn.net/LZK_Dreamer/article/details/120176653
然后大概看懂怎么回事了,于是乎开整。
下面是最终完整代码:(至于怎么用就不用说了吧,能找到这篇文章的人能不会用吗?)
apply plugin: 'maven-publish'
//每次打包就修改下面这4行就行了,要是配合jenkis就不用手动改了。
def pom_version_dev = '0.1.66-dev' //DEV版本,版本号。
def pom_version_beta = '0.1.1-beta' //BETA版本,版本号。
def pom_version_release = '0.0.1' //RELEASE版本,版本号。
def pom_version_type = 'DEV' //指定打包类型:分为 DEV、BETA、RELEASE 三种
配置好之后,以下无需再修改!!!
def pom_name = 'android' //这个好像没用
def pom_description = 'my utils' //描述
def pom_groupId = 'xxxx.xxxxxxxxxxxxxxxxxxxx.my_library' //groupId
def pom_artifactId = 'utils' //artificatId
def pom_version // 根据类型最终选择的版本名,无需关注
def repoDeployUserName = '私有仓库发布时的用户名'
def repoDeployPassword = '私有仓库发布时的密码'
def repoUrlRelease = 'http://maven.xxxxx.com/repository/android-release/'
def repoUrlBeta = 'http://maven.xxxxx.com/repository/android-beta/'
def repoUrlDev = 'http://maven.xxxxx.com/repository/android-dev/'
def repoUrl // 根据类型最终选择的上传URL,无需关注
// 这个好像用不到?
task cleanDir(type: Delete) {
delete buildDir
}
// 生成文档注释
task androidJavadocs(type: Javadoc) {
failOnError = false
source = android.sourceSets.main.java.srcDirs // 设置源码所在的位置
ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
classpath += files(ext.androidJar)
}
// 将文档打包成jar 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
// 指定文档名称
archiveClassifier.set('javadoc')
from androidJavadocs.destinationDir
}
// 将源码打包 生成sources.jar
task androidSourcesJar(type: Jar) {
archiveClassifier.set('sources')
from android.sourceSets.main.java.srcDirs
}
// 是否是开发版本,开发版本带doc
def isDevOrBetaBuild(String version) {
if (version == null || version.isEmpty()) {
throw Exception(">>>>>>>>>>>>>>编译失败,POM_VERSION_TYPE = " + pom_version_type.toLowerCase() + " ,请确认maven_user.properties文件中 POM_VERSION_TYPE 参数填写正确,POM版本必须为(DEV、BETA、RELEASE)中的一种类型<<<<<<<<<<");
}
return version.toLowerCase().endsWith("dev") || version.toLowerCase().endsWith("beta");
}
afterEvaluate {
if (pom_version_type.toLowerCase() == "dev") {
repoUrl = repoUrlDev
pom_version = pom_version_dev
} else if (pom_version_type.toLowerCase() == "beta") {
repoUrl = repoUrlBeta
pom_version = pom_version_beta
} else if (pom_version_type.toLowerCase() == "release") {
repoUrl = repoUrlRelease
pom_version = pom_version_release
} else {
throw Exception(">>>>>>>>>>>>>>上传失败,POM_VERSION_TYPE = " + pom_version_type + " ,请确认maven_user.properties文件中 POM_VERSION_TYPE 参数填写正确,POM版本必须为(DEV、BETA、RELEASE)中的一种类型<<<<<<<<<<");
}
// 输出一下相关信息
println "pom_version_type = " + pom_version_type.toLowerCase()
println "pom_version = " + pom_version
println "repoUrl = " + repoUrl + "\n"
publishing {
publications {
uploadArchives(MavenPublication) { //uploadArchives是任务名字,可以随意取,压根用不到。
from components.release // 必须加这个,不然aar不会上传。
if (isDevOrBetaBuild(pom_version)) {
artifact(androidSourcesJar) //将源码打包进aar
artifact(androidJavadocsJar) //将注释打包进aar
}
description = pom_description
groupId = pom_groupId
artifactId = pom_artifactId
version = pom_version
}
}
repositories {
maven {
allowInsecureProtocol true //是否支持不安全的连接
name = pom_name
url = repoUrl
credentials {
username = repoDeployUserName
password = repoDeployPassword
}
}
}
}
}
//最新版本参考资料:
//https://blog.csdn.net/qq_37455727/article/details/119778435
//https://blog.csdn.net/LZK_Dreamer/article/details/120176653
//旧版本参考资料:
//https://blog.csdn.net/ouyang_peng/article/details/56872556
经过实际测试,是可以用的,dev发布之后带文档,beta和release不带文档。
另外发现几个不同
1就是,执行发布的时候得用命令:./gradlew publish 作为一个懒人,好不容易从DOS中挣扎出来,能再回去用命令?必须GUI。
在这里新建一个Gradle配置,Tasks填写 publish 即可。下次发布,直接选中这个配置,然后运行就可以了。
2跟之前有点不同的是,以前控制台会有正在传输aar的回显,知道进行到上传这一步了,现在没有,只会显示最终的success,有错误的话会报错,例如仓库不允许重复发布。不过这都是小事~~~