多个开源项目Bintray一键发布环境部署
我们发布到Bintray上共享的一般是一些库,而不是完整的App,而这些库是依附在我的主项目之中,如果我们主项目只维护一个共享库,那没什么问题,但维护多个开源库呢?不规划一下打包发布的流程,那么就会浪费我更很多的时间在打包发布上。截至至撰文时,笔者的ProjectX主项目已经管理维护者16个开源库,不规划一套打包方案,那么妥妥的能把笔者累死。
基础Plugin载入
需要实现自动化发包,就必须载入gradle-bintray-plugin与android-maven-gradle-plugin(点击链接查看最新版本号,使用最新版本插件)。载入方式有两种:
- 传统方式
dependencies {
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.1'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
}
- 新型方式(Gradle 2.1)
plugins {
id "com.jfrog.bintray" version "1.7.1"
id "com.github.dcendents.android-maven" version "1.5"
}
使用新型方式导入的gradle-bintray-plugin会提交不成功,不知AS更新以后是否解决,但是笔者出错的版本是1.7.1,新版本没出来前gradle-bintray-plugin还是建议使用传统方式,android-maven-gradle-plugin可以选择新型方式。
部署方案
- 在库根目录(不是项目根目录)创建bintray.gradle文件,文件内容(可以直接拷贝给其他项目使用):
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
// load properties
Properties properties = new Properties()
File localPropertiesFile = project.file("local.properties");
if (localPropertiesFile.exists()) {
properties.load(localPropertiesFile.newDataInputStream())
}
File projectPropertiesFile = project.file("project.properties");
if (projectPropertiesFile.exists()) {
properties.load(projectPropertiesFile.newDataInputStream())
}
// read properties
def projectName = properties.getProperty("project.name")
def projectDesc = properties.getProperty("project.desc")
def projectGroupId = properties.getProperty("project.groupId")
def projectArtifactId = properties.getProperty("project.artifactId")
def projectVersionName = android.defaultConfig.versionName
def projectPackaging = properties.getProperty("project.packaging")
def projectSiteUrl = properties.getProperty("project.siteUrl")
def projectGitUrl = properties.getProperty("project.gitUrl")
def projectIssueTrackerUrl = properties.getProperty("project.issueTrackerUrl")
def developerId = properties.getProperty("developer.id")
def developerName = properties.getProperty("developer.name")
def developerEmail = properties.getProperty("developer.email")
def bintrayUser = properties.getProperty("bintray.user")
def bintrayApikey = properties.getProperty("bintray.apikey")
// This generates POM.xml with proper parameters
install {
repositories.mavenInstaller {
pom.project {
name projectName
groupId projectGroupId
artifactId projectArtifactId
version projectVersionName
packaging projectPackaging
url projectSiteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection projectGitUrl
developerConnection projectGitUrl
url projectSiteUrl
}
}
}
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.source
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
options {
encoding "UTF-8"
charSet 'UTF-8'
author true
version projectVersionName
links "http://docs.oracle.com/javase/7/docs/api"
title projectName
}
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
from androidJavadocs.destinationDir
classifier = 'javadoc'
}
task androidSourcesJar(type: Jar) {
from android.sourceSets.main.java.source
classifier = 'sources'
}
if (JavaVersion.current().isJava8Compatible()) {
allprojects {
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
}
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
// bintray configuration
bintray {
user = bintrayUser
key = bintrayApikey
group = projectGroupId
configurations = ['archives']
pkg {
repo = "maven"
name = projectName
websiteUrl = projectSiteUrl
vcsUrl = projectGitUrl
desc = projectDesc
issueTrackerUrl = projectIssueTrackerUrl
licenses = ["Apache-2.0"]
publish = true
publicDownloadNumbers = true
}
}
- 在库根目录创建project.properties用于配置项目信息(不同项目需要配置不同值):
#project
project.name=BaseTabStrip
project.groupId=am.widget
project.artifactId=basetabstrip
project.packaging=aar
project.desc=项目描述
project.siteUrl=https://github.com/AlexMofer/ProjectX/tree/master/basetabstrip
project.gitUrl=https://github.com/AlexMofer/ProjectX.git
project.issueTrackerUrl=https://github.com/AlexMofer/ProjectX/issues
- 在库根目录创建local.properties用于配置bintray登录信息(可以直接拷贝给其他项目使用,需要加入git忽略列表):
##必须Git忽略此文件,其包含隐私信息
#bintray
bintray.user=你的bintray账户
bintray.apikey=API Key
#developer
developer.id=*******
developer.name=***
developer.email=*******@****.com
- git添加bintray.gradle与project.properties,忽略local.properties :
# Local configuration file (sdk path, etc)
local.properties
- 在库的build.gradle最后加入:
//apply from: "bintray.gradle"
发布
将要提交的开源库的build.gradle中的 apply from: "bintray.gradle" 去掉注释,保证 versionName 是你想要发布的,那么控制台输入gradlew bintrayUpload就可以了,成功以后再将 apply from: "bintray.gradle" 注释掉就不会干扰其他开源项目的提交了。
注意
- Git一定要忽略掉local.properties文件
- 发布完毕以后,build.gradle中的 apply from: "bintray.gradle" 要记得注释掉,否则会干扰其他开源项目提交
- bintray.gradle不单单是发布处理,还包括中文注释乱码处理