之前写过一篇Gradle发布到maven的Blog,具体可见 Android Gradle上传Maven仓库。最近由于项目需要需要一个publishToLocal的功能,发现基于之前的maven插件不太好配置,而且Gradle官方也有了新的发布插件,所以就产生了本文,基于maven-publish插件实现maven上传。
首先我们明确一下我们的需求:
1.我们需要发布到maven
2.我们需要publishToLocal功能
3.我们需要SnapShot版控制
我们首先看下项目下的gradle.properties文件:
# 是否支持maven
supportMaven = true
# 仓库地址
mavenUrl = http://maven.test.com
# Snap 的仓库地址
snapUrl = http://maven.test.snapshot.com
# maven name
mavenUserName = name 
# maven password
mavenUserPwd = password 
snapShot = true
我们定义了几个控制项,用来控制当前工程是否支持maven, 各个仓库地址,maven的用户名和密码,以及是否打包成snapShot版
然后我们完成一份maven-common.gradle文件,用来作为maven模块的复用:
apply plugin: 'maven-publish'
def getMavenUrl() {
    if (isSnapShot()) {
        return project.properties.get("snapUrl")
    } else {
        return project.properties.get("mavenUrl")
    }
}
def getMavenUserName() {
    return project.properties.get("mavenUserName")
}
def getMavenUserPwd() {
    return project.properties.get("mavenUserPwd")
}
def isSnapShot() {
    return project.properties.containsKey("snapShot") &&
            project.properties.get("snapShot").toBoolean()
}
// 获取系统时间
def static releaseTime() {
    return new Date().format("yyyyMMdd.HHmm", TimeZone.getTimeZone("GMT+08"))
}
def getVersionNameStr() {
    if (project.properties.containsKey("versionName")) {
        return "${versionName}"
    } else {
        return "${android.defaultConfig.versionName}"
    }
}
def getTimeStr() {
    return new Date().format('yyyyMMddHHmmss')
}
publishing {
    repositories {
        maven {
            url getMavenUrl()
            credentials {
                username getMavenUserName()
                password getMavenUserPwd()
            }
        }
    }
    publications {
        sdk(MavenPublication) {
            def versionStr = getVersionNameStr()
            if (isSnapShot()) {
                versionStr = "${versionName}.${getTimeStr()}"
            }
            groupId "groupId"
            artifactId "$project.name"
            version versionStr
            artifact(generateJar)
        }
    }
}
在项目下配置是否支持maven发布 写入到root的build.gradle中:
subprojects {
    if (project.getProperties().containsKey("supportMaven") &&
            project.getProperties().get("supportMaven").toBoolean()) {
        apply from: rootProject.file("maven-common.gradle")
    }
}
将maven地址加入到repositories中,注意如果需要发布到本地需要加入mavenLocal():
allprojects {
    repositories {
        google()
        jcenter()
	mavenLocal()
        maven {
            url = "test"
        }
    }
}
以上配置结束,可以通过 ./gradlew publishToLocal发布到本地地址,通过./gradlew publish 发布到远程仓库。
其它
publishToLocal无法覆盖生效
发布到local前需要移除gradle的缓存,gradle的缓存目录在 .gradle下的cache中可以写shell脚本方便控制:
publishToLocal () {
    echo begin publishToLocal : $1
    # 编译
    ./gradlew $1:build
    # 发布
    ./gradlew $1:publishToMavenLocal
    # 清空缓存
    cachePath=$GRADLE_HOME/caches/modules-2/files-2.1/{Your Group Id}/$1
    echo $cachePath
    if [ ! -f "$cachePath" ];then
        echo "not find cache file"
    else
        rm -rf $cachePath
    fi
}
publishToLocal {Your Project Name}
将示例的GroupId 和 project Name换成自己的即可
0.0.1.+ 无法获取最新版本
系统缓存默认时间为24小时,可以将缓存时间改为0:
 configurations.all {
        resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
    }
0.0.1-SNAPSHOT 无法获取最新版本
将项目标记为 changing=true 然后配置:
    configurations.all {
        resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
    }
具体描述可以参照 之前的老文章见篇头
欢迎关注我的微信公众号
璐豪笔记