經常使用 Giithub 的同學相信一定對下面的內容不陌生
compile 'com.werb.moretype:moretype:0.2.1'
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
repositories {
google()
jcenter()
maven {url 'https://jitpark.io/'}
}
dependencies {
complie 'com.github.nisrulz:awesomelib:1.0'
}
通常當我們寫完一個開源庫之后,要把它發(fā)布到 maven 倉庫中残揉,這樣我們就可以遠程依賴我們的開源庫胧后,不必像在用 Eclipse+Ant 組合的時候,引入一個庫都是下載 jar 包或者 aar 包放到 lib 目錄下抱环,然后右鍵添加引用壳快。
當使用 Android Studio+Gradle 的時候,我們就可以向上圖中那樣镇草,從遠端拉取 jar 包和 aar 包引入本地眶痰。
常見的 Maven 倉庫
JCenter、MavenCenter梯啤、JitPack
repositories {
google() // google 倉庫
jcenter() // ?JCenter 倉庫
mavenCenter() // mavenCenter 倉庫
maven {url 'https://jitpark.io/'} // jitpark 倉庫
}
當你新建一個 Android 應用的時候竖伯,在根目錄中的 Gradle 中上圖中的配置一定不少見吧。最新的 Android Studio 3.0 中 Google 將自己的依賴包放在了 google ( )因宇,最開始 Android Studio 將 mavenCenter 作為默認的倉庫地址黔夭,但由于 mavenCenter 上傳速度慢宏胯,操作不友好羽嫡,之后 Android Studio 將默認的倉庫地址替換為了 JCenter本姥。如果你是 AS 2 的開發(fā)者,那么 AS 中的默認倉庫為 mavenCenter 和 JCenter杭棵,如果你是 AS 3 的開發(fā)者婚惫,那么 AS 中的默認倉庫為 mavenCenter 、 JCenter 和 google魂爪。
那么 jitpack 又是什么呢先舷?
jitpack 的寫法和前2個不一樣,寫法是 maven {} 里面加入地址滓侍,其實這個才是 maven 倉庫標準引用方法蒋川,jcenter 和 mavenCenter 由于是默認的標準 Android 倉庫,相當于定義了一個別名撩笆。 所以一些自定義的倉庫都是這種寫法然后填入自己的倉庫網址捺球,例如
maven { url 'https://maven.fabric.io/public' }
Bintray
JCenter 庫是托管在 Bintray 網站上的,所以我們首先需要注冊一個 Bintary 的賬戶夕冲,然后新建一個我們自己的 maven 倉庫氮兵,之后需要發(fā)布我們的開源庫到 Bintary 上的 maven 倉庫中,最后將我們的開源庫提交的 JCenter 中歹鱼。流程就是這樣泣栈,好了當然沒有這么簡單,下面就為大家介紹具體的操作流程弥姻。
- 創(chuàng)建 Bintray 賬戶
這是 Bintary 的主頁南片,但我們不能直接點圖中的綠色按鈕注冊,因為 Bntary 增加了 Organization 的概念庭敦,點擊綠色按鈕是默認創(chuàng)建一個組織的賬戶疼进,我們需要創(chuàng)建的是自己的個人賬戶,所以這是一個注意的地方螺捐,千萬不要選錯颠悬。
那么個人賬戶創(chuàng)建的地方是哪里呢?
https://bintray.com/signup/oss
就是上面的這個地址定血,點擊進去創(chuàng)建個人賬戶赔癌,網頁點開是這樣的
登錄成功之后點擊創(chuàng)建一個 maven 倉庫
填寫倉庫配置信息,type 選擇 maven
創(chuàng)建成功以后你會看到下面這個頁面澜沟,我這里創(chuàng)建的 maven 倉庫名叫 MyLibrary
- 獲取 API key
點擊網頁右上角的頭像 Edit Profile灾票,按照圖中的操作保存我們的 API key,通過 API key 我們可以在 Android Studio 中發(fā)布我們的開源庫到 Bintray 中茫虽。
- 配置我們的開源庫
上傳的方式有兩種,第一種是通過 bintray 官方出的插件
第二種是一個國外組織開源的插件
下面會為大家依次介紹這兩種插件的使用方式
bintray/gradle-bintray-plugin
- 在項目根目錄下的 build.gradle 添加插件依賴
buildscript {
repositories {
google()
jcenter()
maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
- 在項目根目錄下的 gradle.properties 中配置我們的開源庫信息
PROJ_NAME=bintray-build
PROJ_GROUP=com.werb.bintraybuild
PROJ_ARTIFACTID=bintraybuild
PROJ_VERSION=0.1.0
PROJ_WEBSITEURL=https://github.com/Werb/android-bintray-build
PROJ_ISSUETRACKERURL=https://github.com/Werb/android-bintray-build/issues
PROJ_VCSURL=https://github.com/Werb/android-bintray-build.git
PROJ_DESCRIPTION=bintraybuild project
DEVELOPER_ID=wanbo
DEVELOPER_NAME=werbhelius
DEVELOPER_EMAIL=werbhelius@gmail.com
- 在項目根目錄下的 local.properties 中填寫我們的 user 和 API key婴氮,這里的內容是完全可以放在 gradle.properties 中的斯棒,但是通常我們的開源庫都會發(fā)到 Github 的公共倉庫中,如果這樣的話那我們的 API key 就會暴露給其他人主经,那當然是不行的荣暮,所以我們就在 git 忽略的 local.properties 中配置我們的 API key。
BINTRAY_USER=werbhelius
BINTRAY_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 在我們開源庫的目錄下罩驻,新建一個 bintray.gradle 文件穗酥,用于上傳開源庫以及配置發(fā)布的文件內容包括源碼,文檔以及 AAR惠遏。
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID
apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += configurations.compile
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "https://androiddoc.qiniudn.com/reference/"
title "$PROJ_NAME $PROJ_VERSION"
}
}
artifacts {
archives sourcesJar
archives javadocJar
}
install {
repositories.mavenInstaller {
pom.project {
name PROJ_NAME
description PROJ_DESCRIPTION
url PROJ_WEBSITEURL
inceptionYear '2017'
packaging 'aar'
groupId PROJ_GROUP
artifactId PROJ_ARTIFACTID
version PROJ_VERSION
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
scm {
connection PROJ_VCSURL
url PROJ_WEBSITEURL
}
developers {
developer {
id DEVELOPER_ID
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
}
}
}
bintray {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
user = properties.getProperty('BINTRAY_USER')
key = properties.getProperty('BINTRAY_KEY')
configurations = ['archives']
dryRun = false
publish = true
pkg {
repo = 'MyLibrary'
name = PROJ_NAME
licenses = ['Apache-2.0']
vcsUrl = PROJ_VCSURL
websiteUrl = PROJ_WEBSITEURL
issueTrackerUrl = PROJ_ISSUETRACKERURL
publicDownloadNumbers = true
version {
name = PROJ_VERSION
desc = PROJ_DESCRIPTION
vcsTag = PROJ_VERSION
gpg {
sign = true
}
}
}
}
這里向大家介紹一下 aar 和 jar 的區(qū)別砾跃。
.jar :只包含了 class 文件與清單文件,不包含資源文件爽哎,如圖片等所有 res 中的文件蜓席。
.aar:包含所有資源,class** 以及 res 資源文件全部包含课锌。
如果你只是一個簡單的類庫那么使用生成的 *.jar文件即可厨内;如果你的是一個UI庫,包含一些自己寫的控件布局文件以及字體等資源文件那么就只能使用 *.aar 文件渺贤。
- 在我們開源庫中的 build.gradle 文件中引入 bintary.gradle 雏胃,注意引入的命令需要寫在最后一行,不然會報錯志鞍。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
apply from: './bintray.gradle'
- 當上述的配置全部完成之后瞭亮,我們可以上傳我們的開源庫了,打開 Terminal固棚,執(zhí)行 ./gradlew install统翩,執(zhí)行完成后,打開 build 目錄你會發(fā)現(xiàn)生成了 aar 包此洲、javadoc 文檔厂汗、sources 源碼以及上傳 maven 需要的 pom 配置文件。
- 生成上述文件后呜师,繼續(xù)在 Terminal 中執(zhí)行 ./gradlew bintrayUpload 提示成功之后娶桦,我們的開源庫就發(fā)布成功啦。
發(fā)布成功之后,打開之前 bintray 網頁衷畦,你會發(fā)現(xiàn)在之前我們創(chuàng)建的 maven 倉庫中栗涂,已經有我們剛剛發(fā)布的庫了。
novoda/bintray-release
使用這個插件上傳比較簡單祈争,只需要兩步就可以
- 在項目根目錄下的 build.gradle 添加插件依賴
buildscript {
repositories {
google()
jcenter()
maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.novoda:bintray-release:0.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
- 在開源庫的目錄中 build.gradle 中配置上傳的信息斤程,同樣配置到文件的最后。
apply plugin: 'com.novoda.bintray-release'
publish {
repoName = "MyLibrary"
userOrg = 'werbhelius'
groupId = 'com.werb.bintrayrelease'
artifactId = 'bintrayrelease'
publishVersion = '0.1.0'
desc = 'bintraybuild project'
website = 'https://github.com/Werb/android-bintray-build'
}
- 發(fā)布我們的開源項目铛嘱,在 Terminal 輸入以下命令暖释,替換 BINTRAY_USERNAME 和 BINTRAY_KEY 為你自己的 user 和 API key,執(zhí)行命令之前需 Gradle Build墨吓。
./gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
這樣我們的開源庫就上傳成功啦。
發(fā)布到 JCenter
在 bintray 開源庫的網頁中纹磺,右邊會有 Add to JCenter 的提示帖烘,點擊提交 commit 就可以啦,一般在幾個小時或一天的時間就會提示你添加成功橄杨。
使用我們的開源庫
這里向大家介紹一下我們之前配置的信息秘症,兩種發(fā)布方式的配置信息是一致的,我們以
bintray/gradle-bintray-plugin 為例式矫。
PROJ_NAME=bintray-build
PROJ_GROUP=com.werb.bintraybuild
PROJ_ARTIFACTID=bintraybuild
PROJ_VERSION=0.1.0
PROJ_WEBSITEURL=https://github.com/Werb/android-bintray-build
PROJ_ISSUETRACKERURL=https://github.com/Werb/android-bintray-build/issues
PROJ_VCSURL=https://github.com/Werb/android-bintray-build.git
PROJ_DESCRIPTION=bintraybuild project
DEVELOPER_ID=wanbo
DEVELOPER_NAME=werbhelius
DEVELOPER_EMAIL=werbhelius@gmail.com
- PROJ_NAME : 開源庫的名字
- PROJ_GROUP : 用于上傳的 group id
- PROJ_ARTIFACID : 使用的 artifactId
- PROJ_VERSION : 發(fā)布的版本
- PROJ_WEBSITEURL : Github 地址
- PROJ_ISSUETRACKURL : Issue 地址
- PROJ_VCSURL : git 地址
- PROJ_DESCRIPTION : 開源庫的描述
所以當我們的庫發(fā)布成功之后 Gradle 的依賴地址的格式為:
implementation 'groupId:artifactId:version'
如果你成功發(fā)布到 JCenter 就可以直接按照上面的規(guī)則依賴自己的項目乡摹。
如果你沒有發(fā)布到 JCenter 需要在項目根目錄中的 build.gradle 中添加你的 maven 倉庫地址。
buildscript {
repositories {
google()
jcenter()
maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'com.novoda:bintray-release:0.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
注意事項
- 不同的開源庫需上傳至不同的 Github 倉庫中采转,因為我們在 bintray 上會指定開源庫的 Github 地址聪廉,請確保唯一性。
- 隨著 Android Studio 3.0 的發(fā)布故慈,Gradle 更新到了 4.1+板熊,在 Gradle 3.6 之后的版本,增加了 implementation 和 api 等新的依賴命令察绷,需要注意的是干签,以上兩種插件的 Gradle 版本均在 3.6 以下,所以是不支持新的命令的拆撼。這樣會引發(fā)一個錯誤容劳,當你的 Labrary 依賴其他開源項目的時候,如果你是使用的 implementation 和 api 等新的依賴命令闸度,在生成 aar 和 maven pom 文件時竭贩,pom 文件中并不會把你 Labrary 中所依賴的其他庫配置進去,這樣當在使用你的 Labrary 構建依賴的時候筋岛,Gradle 不會把 Labrary 中所依賴的庫一并下載下來娶视,當使用這些庫的時候就會引發(fā) ClassNotFound 的錯誤。所以在上面兩個插件還沒有更新到最新版的 Gradle 的時候,請繼續(xù)使用舊的 compile 依賴命令肪获。
- 有關 Android Studio 3.0 新的依賴方式寝凌,請查看上期更新的文章:Android Studio 3.0 新的依賴方式
源碼
有關以上兩種上傳方式的代碼已經發(fā)布到 Github,關于更多的配置可以參照 Github 上面的代碼孝赫,地址如下:
https://github.com/Werb/android-bintray-build