项目作者: lizhangqu

项目描述 :
maven发布插件和bintray发布插件
高级语言: Groovy
项目地址: git://github.com/lizhangqu/CorePublish.git
创建时间: 2017-10-15T12:53:12Z
项目社区:https://github.com/lizhangqu/CorePublish

开源协议:

下载


Maven发布插件&Bintray发布插件

使用此插件时,请移除

  1. classpath "com.github.dcendents:android-maven-gradle-plugin:1.5"
  2. classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'

以及移除原先的发布脚本

然后在buildscript中加入classpath依赖

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath 'io.github.lizhangqu:core-publish:1.4.1'
  7. }
  8. }

最低支持gradle 2.10,低于gradle 2.10时会报错,最高支持到gradle 5.6.2

配置相关属性并应用插件

  1. ext {
  2. RELEASE_REPOSITORY_URL = "file://${project.rootProject.file('repo/release')}"
  3. SNAPSHOT_REPOSITORY_URL = "file://${project.rootProject.file('repo/snapshot')}"
  4. RELEASE_REPOSITORY_USERNAME = ""
  5. RELEASE_REPOSITORY_PASSWORD = ""
  6. SNAPSHOT_REPOSITORY_USERNAME = ""
  7. SNAPSHOT_REPOSITORY_PASSWORD = ""
  8. }
  9. apply plugin: 'android.publish'
  10. //apply plugin: 'java.publish'

gradle.properties中配置

  1. group=io.github.lizhangqu
  2. archivesBaseName=core-publish
  3. version=1.0.0-SNAPSHOT

或者

  1. PROJECT_POM_GROUP_ID=io.github.lizhangqu
  2. PROJECT_POM_ARTIFACT_ID=core-publish
  3. PROJECT_POM_VERSION=1.0.0-SNAPSHOT

Maven发布配置

需要配置maven地址,账号和用户名,值可以存在gradle.properties,local.properties或者project.ext属性中

  1. RELEASE_REPOSITORY_URL =
  2. SNAPSHOT_REPOSITORY_URL =
  3. RELEASE_REPOSITORY_USERNAME =
  4. RELEASE_REPOSITORY_PASSWORD =
  5. SNAPSHOT_REPOSITORY_USERNAME =
  6. SNAPSHOT_REPOSITORY_PASSWORD =

Bintray发布配置

发布到Bintray时,需要提供 BINTRAY_APIKEY 和 BINTRAY_USER, 值可以存在gradle.properties,local.properties或者project.ext属性中,建议放在local.properties中,不进行版本跟踪

  1. BINTRAY_USER =
  2. BINTRAY_APIKEY =

支持属性列表

其中发布到maven时PROJECT_POM_GROUP_ID,PROJECT_POM_ARTIFACT_ID,PROJECT_POM_VERSION是必选项(或者配置group,archivesBaseName,version进行代替),如果未设置,则使用默认值rootProject.name:project.name:unspecific。其他为可选项。
对于发布到Bintray时,其他配置基本都是必选项,建议根据控制台错误信息进行配置。

gradle.properties

  1. PROJECT_POM_GROUP_ID=
  2. PROJECT_POM_ARTIFACT_ID=
  3. PROJECT_POM_VERSION=
  4. //以上三个可使用group,archivesBaseName,version替换
  5. POM_DESCRIPTION=
  6. POM_LICENSE=
  7. POM_LICENSE_URL=
  8. POM_WEBSITE_URL=
  9. POM_VCS_URL=
  10. POM_ISSUE_URL=
  11. POM_DEVELOPER_ID=
  12. POM_DEVELOPER_NAME=
  13. POM_DEVELOPER_EMAIL=
  14. POM_ENABLE_JAVADOC=false //是否生成javadoc
  15. POM_ENABLE_COORDINATE=false //是否主动设置project的group,archivesBaseName,version

build.gradle

  1. project.ext{
  2. PROJECT_POM_GROUP_ID=
  3. PROJECT_POM_ARTIFACT_ID=
  4. PROJECT_POM_VERSION=
  5. //以上三个可使用group,archivesBaseName,version替换
  6. POM_DESCRIPTION=
  7. POM_LICENSE=
  8. POM_LICENSE_URL=
  9. POM_WEBSITE_URL=
  10. POM_VCS_URL=
  11. POM_ISSUE_URL=
  12. POM_DEVELOPER_ID=
  13. POM_DEVELOPER_NAME=
  14. POM_DEVELOPER_EMAIL=
  15. POM_ENABLE_JAVADOC=false //是否生成javadoc
  16. POM_ENABLE_COORDINATE=false //是否主动设置project的group,archivesBaseName,version
  17. }

local.properties

  1. PROJECT_POM_GROUP_ID=
  2. PROJECT_POM_ARTIFACT_ID=
  3. PROJECT_POM_VERSION=
  4. POM_DESCRIPTION=
  5. POM_LICENSE=
  6. POM_LICENSE_URL=
  7. POM_WEBSITE_URL=
  8. POM_VCS_URL=
  9. POM_ISSUE_URL=
  10. POM_DEVELOPER_ID=
  11. POM_DEVELOPER_NAME=
  12. POM_DEVELOPER_EMAIL=
  13. POM_ENABLE_JAVADOC=false //是否生成javadoc
  14. POM_ENABLE_COORDINATE=false //是否主动设置project的group,archivesBaseName,version

github registry支持

发布配置

  1. RELEASE_REPOSITORY_URL=https://maven.pkg.github.com/OWNER/REPOSITORY
  2. SNAPSHOT_REPOSITORY_URL=https://maven.pkg.github.com/OWNER/REPOSITORY
  3. RELEASE_REPOSITORY_USERNAME=OWNER
  4. RELEASE_REPOSITORY_PASSWORD=token
  5. SNAPSHOT_REPOSITORY_USERNAME=OWNER
  6. SNAPSHOT_REPOSITORY_PASSWORD=token

其中REPOSITORY改成仓库名,OWNER改成用户名,token改成github的token,token具有write:packages/read:packages权限

拉取配置

公共仓库

  1. allprojects {
  2. repositories {
  3. maven (){
  4. url "https://maven.pkg.github.com/"
  5. }
  6. }
  7. }

如果是私有的,请带上用户认证信息,token具有read:packages权限

  1. allprojects {
  2. repositories {
  3. maven() {
  4. url "https://maven.pkg.github.com/"
  5. credentials {
  6. username = 'OWNER'
  7. password = 'TOKEN'
  8. }
  9. }
  10. }
  11. }

maven发布

release发布

release发布使用命令

  1. gradle :moduleName:uploadRelease

uploadRelease这个task只是依赖了release这个task,没做其他多余工作

release发布依赖io.github.lizhangqu:core-release:1.0.0插件,默认使用递增版本号配置,如果需要,请覆写其配置项

  1. release {
  2. failOnCommitNeeded = true // 本地有文件未提交,构建失败
  3. failOnPublishNeeded = true // 本地代码未push,构建失败
  4. failOnSnapshotDependencies = true // 依赖了SNAPSHOT包,构建失败
  5. failOnUnversionedFiles = true // 本地有未进行版本追踪的文件,构建失败
  6. failOnUpdateNeeded = true // 未将远端代码更新至本地,构建失败
  7. revertOnFail = true // 构建发生错误时,回滚插件的提交
  8. preCommitText = '' // 插件创建的提交的message
  9. preTagCommitMessage = '[Gradle Release Plugin] - pre tag commit: ' // 如果存在snapshot版本,去snapshot字样时使用的message
  10. tagCommitMessage = '[Gradle Release Plugin] - creating tag: ' // 创建tag的message
  11. newVersionCommitMessage = '[Gradle Release Plugin] - new version commit: ' // 创建新版本的message
  12. tagTemplate = '$name/${version}' // tag的模板,内部使用模板引擎渲染,支持${name},${version},${group},${archivesBaseName},必须为单引号,如果存在archivesBaseName,此值默认是$archivesBaseName/$version,否则默认是$name/$version
  13. versionPropertyFile = 'gradle.properties' // 版本号所在文件
  14. versionProperties = [] //需要同步更新的版本号属性
  15. versionKey = null // 默认使用version作为key,当需要自定义时,设置此值
  16. buildTasks = ['build'] // 构建的task,建议设置为 assembleRelease,如果是android项目,此值默认为assembleRelease,否则默认是build
  17. versionPatterns = [
  18. /(\d+)([^\d]*$)/: { Matcher m, Project p -> m.replaceAll("${(m[0][1] as int) + 1}${m[0][2]}") }
  19. ] //版本匹配正则
  20. scmAdapters = [
  21. net.researchgate.release.GitAdapter,
  22. net.researchgate.release.SvnAdapter,
  23. net.researchgate.release.HgAdapter,
  24. net.researchgate.release.BzrAdapter
  25. ]
  26. git {
  27. requireBranch = 'master' // 构建需要的分支
  28. pushToRemote = 'origin' // push的远端
  29. pushToBranchPrefix = ''
  30. commitVersionFileOnly = false
  31. signTag = false
  32. }
  33. svn {
  34. username = null
  35. password = null
  36. pinExternals = false // allows to pin the externals when tagging, requires subversion client >= 1.9.0
  37. }
  38. }

snapshot发布

snapshot发布使用命令

  1. gradle :moduleName:uploadSnapshot

uploadSnapshot这个task依赖uploadArchives,发布时请确保版本号为SNAPSHOT,如果未追加-SNAPSHOT,则会抛出异常

注意不要使用uploadArchives,此Task被禁用,被uploadRelease和uploadSnapshot取代

Bintray发布

Bintray发布请在gradle.properties中配置属性 release.bintray=true
Bintray只支持release发布,使用命令,发布后需要同步到jcenter的需要到后台进行处理,首次发布需要审核,更多详情见https://bintray.com/

  1. gradle :moduleName:uploadBintray

注意不要使用bintrayUpload,此Task被禁用

自定义发布

如果你需要自定义发布一些文件,需要自己定义publishing,然后使用gradle publish发布,如下

  1. publishing {
  2. publications {
  3. maven(MavenPublication) {
  4. artifact "${project.buildDir}/libs/${project.archivesBaseName}-${project.version}.jar"
  5. }
  6. }
  7. }

除此之外,也可以通过添加 project.artifacts,然后使用uploadSnapshot或者uploadRelease发布

自定义多pom发布

  1. project.afterEvaluate {
  2. uploadArchives {
  3. repositories {
  4. mavenDeployer {
  5. addFilter("yourPomName1") { artifact, file ->
  6. artifact.name == "yourPomName1"
  7. }
  8. addFilter("yourPomName2") { artifact, file ->
  9. artifact.name == "yourPomName2"
  10. }
  11. pom("yourPomName1") {
  12. groupId = 'group1'
  13. artifactId = "name1"
  14. version = "version1"
  15. packaging = 'so'
  16. }
  17. pom("yourPomName2") {
  18. groupId = 'group2'
  19. artifactId = "name2"
  20. version = "version2"
  21. packaging = 'jar'
  22. }
  23. }
  24. }
  25. }
  26. project.artifacts {
  27. archives file: new File("path/to/yourPomName1.so"), name: "yourPomName1"
  28. archives file: new File("path/to/yourPomName2.jar"), name: "yourPomName2"
  29. }
  30. }

自定义classifier发布

  1. project.artifacts {
  2. archives file: new File("path/to/mainFile")
  3. //必要时可发布classsifier文件,发布的文件需要group:name:version:classifier才能拉下来
  4. archives classifier: 'armeabi', file: new File("path/to/classifierFile")
  5. archives classifier: 'armeabi-v7a', file: new File("path/to/classifierFile")
  6. archives classifier: 'arm64-v8a', file: new File("path/to/classifierFile")
  7. archives classifier: 'x86', file: file: new File("path/to/classifierFile")
  8. archives classifier: 'x86_64', file: new File("path/to/classifierFile")
  9. archives classifier: 'mips', file: new File("path/to/classifierFile")
  10. archives classifier: 'mips64',file: new File("path/to/classifierFile")
  11. }

native动态库依赖

  1. apply plugin: 'android.native'
  2. dependencies {
  3. nativeCompile 'com.snappydb:snappydb-native:0.2.0:armeabi@so'
  4. nativeCompile 'com.snappydb:snappydb-native:0.2.0:x86@so'
  5. nativeCompile 'com.snappydb:snappydb-native:0.2.0:mips@so'
  6. nativeCompile "com.snappydb:snappydb-native:0.2.0:armeabi-v7a@so"
  7. }

其中classifier可选,其值为 armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64其中一个,不是这些值会抛异常。
并且依赖中的ext @so是否需要携带取决于发布时默认的文件是否是so,如果存在classifier, 则@so为必选项,默认值为@jar,为了让其寻找so,需要手动指定为@so
不支持引入所有abi,只支持单个abi逐个引入

多module发布

C依赖B,B依赖A,且业务最终只需要依赖C,传递依赖B和A

根目录下build.gradle中配置发布任务

  1. task uploadSnapshot(type: MultiProjectUpload) {
  2. uploadProjects = ['A','B','C'] //在前面的会先被发布,且uploadProjects必须配置在releasePublish前面,值为module名
  3. releasePublish = false //snapshot构建
  4. }
  5. task uploadRelease(type: MultiProjectUpload) {
  6. uploadProjects = ['A','B','C'] //在前面的会先被发布,且uploadProjects必须配置在releasePublish前面,值为module名
  7. releasePublish = true //release构建
  8. }

注意:版本号的key命名规范必须为POMmodule名.replaceAll(‘-‘,’‘).toUpperCase()_VERSION,版本号所在文件必须为根目录下的gradle.properties

修改A的发布脚本为

  1. ext {
  2. PROJECT_POM_GROUP_ID = "io.github.lizhangqu"
  3. PROJECT_POM_ARTIFACT_ID = "A"
  4. PROJECT_POM_VERSION = "${POM_A_VERSION}"
  5. }
  6. apply plugin: 'android.publish'
  7. release {
  8. versionPropertyFile = "${project.rootProject.projectDir}/gradle.properties"
  9. versionKey = "POM_A_VERSION"
  10. }

修改B的发布脚本为

  1. dependencies {
  2. compile(":A")
  3. }
  4. ext {
  5. PROJECT_POM_GROUP_ID = "io.github.lizhangqu"
  6. PROJECT_POM_ARTIFACT_ID = "B"
  7. PROJECT_POM_VERSION = "${POM_B_VERSION}"
  8. }
  9. apply plugin: 'android.publish'
  10. release {
  11. versionPropertyFile = "${project.rootProject.projectDir}/gradle.properties"
  12. versionKey = "POM_B_VERSION"
  13. }

修改C的发布脚本为

  1. dependencies {
  2. compile(":B")
  3. }
  4. ext {
  5. PROJECT_POM_GROUP_ID = "io.github.lizhangqu"
  6. PROJECT_POM_ARTIFACT_ID = "C"
  7. PROJECT_POM_VERSION = "${POM_C_VERSION}"
  8. }
  9. apply plugin: 'android.publish'
  10. release {
  11. versionPropertyFile = "${project.rootProject.projectDir}/gradle.properties"
  12. versionKey = "POM_C_VERSION"
  13. }

在根目录下的gradle.properties中配置开启坐标覆盖设置

  1. POM_ENABLE_COORDINATE = true

在根目录下的gradle.properties中配置各个模块的版本号

  1. POM_A_VERSION=1.0.0-SNAPSHOT
  2. POM_B_VERSION=1.0.0-SNAPSHOT
  3. POM_C_VERSION=1.0.0-SNAPSHOT

发布时需要注意的是所有模块必须同步发布,即使一个模块一行代码没改动,另一个模块发布的时候,没改动的模块也要随同发布,类似android support包。

jenkins参数化构建传入-Pversion=$version,所有module此时版本号都会取这个version值

发布任务必须带:前缀

  1. ./gradlew :uploadSnapshot
  2. ./gradlew :uploadRelease

特别值得注意的是多module发布的task,必须带:前缀,如snapshot必须使用:uploadSnapshot,而不是uploadSnapshot

com.android.application中使用providedAar

  1. apply plugin: 'android.providedAar'
  2. dependencies {
  3. providedAar 'com.android.support:appcompat-v7:26.1.0'
  4. providedAar project(':lib1')
  5. }