今天想来分享下,如何一步步本身发布一个开源库到 JCenterandroid
这方面的博客网上已经特别多了,因此本篇并不打算仅仅只是记录流程步骤而已,而是尽量讲清楚,为何须要有这个步骤,让大伙知其然的同时还知其因此然,那么掌握就会更深入一点,因此本篇篇幅会很长。另外,本篇是参考、引用、借鉴了如下文章中的内容:git
How to distribute your own Android library through jCenter and Maven Central from Android Studiogithub
虽然是英文版,但有四级基础就能够基本看懂了,文章写得很全,很详apache
实在不想看英文版的,国内有中文版翻译,在***《Android高级进阶》***的第 9 章有完整版的中文翻译api
首先得想清楚一件事:是否是只有写得很牛的开源库,或者只有牛人、大神才能够发布开源库到 JCenter呢?bash
可能有些人以为本身不是大神,本身写不出啥牛逼的开源库,因此不用发布到 JCenter 上给别人用。因此,得先想清楚,你为何要发布一个开源库到 JCenter 上去?网络
学习也行;分享也行;本身用也行;总之,没什么规定说只有大神才能够发布;并发
其实,这里之因此叫作开源库,是由于发布到 JCenter 上以后,大伙均可以使用的缘由。我更喜欢在《Android高级进阶》里的说法:函数库app
我是带着这么一种想法的:maven
做为一个懒人,一些能够在多个项目中使用的公共基础模块,实在不想每次新建项目都手动去复制粘贴,或者手动去导 Module,因此就想着将这些公共基础模块打包发布到 JCenter,之后新建项目时只要配置下 build.gradle 就能够了
Q:你问我为啥不上传到私服?
A:没钱
Q:你问我那不怕代码被盗用?
A:又不是什么牛逼的开源库,就是一些基本的公共模块如工具类,网络层封装等等,别人想用,我高兴还来不及,怕啥
Q:你问我那这些基础模块为啥不用别人开源的,还要本身造轮子?
A:本身的用着顺手,本身的想怎么改就能够怎么改
Q:你问我那不怕发布的开源库代码太槽糕,被人骂?
A:老哥,我又不是大神,我要不写这篇博客,都没人知道我发布了个开源库,反正就我本身使用,怕啥
Q:你问我...
A:老哥,别问了,赶快去发布一个试试看吧,万一之后你就是大神了呢,免得到时再现学
好了,接下去就开始讲发布的步骤了
先盗用开头分享的连接里的一张图
整个流程其实就是上图中介绍的这样,先本地打包成 jar 或 aar 文件,而后上传到 bintray 本身的仓库中,最后发布到 jcenter 上去就能够了。
除了第一步是在本地本身操做外,剩下的操做都是在网页上移移鼠标点一点就能够了
为何会有两个呢?那是由于,第一个是提供给咱们可 ui 交互操做的网站,注册帐号、配置仓库、发布等等操做都是在第一个网址上面操做,咱们也只要记住第一个网站就能够了
第二个是存放这些开源库的网址,若是你想手动下载某个开源库的 jar,那么你能够直接在第二个网址后面加上开源库的路径便可
好比,我以前写过一篇 如何用Android Studio查看build.gradle源码,某些状况下,Android Studio 并无成功将 Android Gradle 插件的源码下载下来,咱们又想去查看源码时,只能本身去下载。写那篇博客的时候 Android Studio 仍是默认配置的 mavenCentral 做为开源库拉取来源的。
但如今新版的 Android Studio 已经改为默认配置 JCenter 做为开源库的来源了,举个例子:
compile 'com.squareup.okhttp:okhttp:2.4.0'
复制代码
若是想手动下载 okhttp 的 jar 包,那么就是访问:https://jcenter.bintray.com/com/squareup/okhttp/okhttp/2.4.0/
以此类推
打开 bintray.com/ 网站,注册一个帐号,也能够选择直接 Github 帐号受权登陆,很简单,不贴图了。
登陆帐号后,跟 Github 操做相似,bintray 容许你在网站上建立本身的仓库,可 public,可 private。
建立仓库的操做跟 Github 是相似的,我就不演示了,我这里建立了一个叫 base-module 的空仓库。
接下去就跟 Github 的概念有点不同了,在 Github 上咱们一个仓库一般对应一个具体的项目,本地项目长啥样,Github 上的仓库基本也就长啥样。
在 bintray 这里,一个仓库我更倾向于把它就理解成仓库的意思,也就是做为容器的做用。建立完一个空仓库后,页面右下角会有一个 Add New Package 按钮,也就是仓库下面还有一层 package 的概念。
一个 package 就是一个可发布到 JCenter 上的开源包,而发布到 JCenter 上的内容是一些 pom,aar,jar 之类的文件,并非整个项目。因此咱们须要先建立一个 package 来准备给本地须要打包发布的 module 生成 pom,aar 等文件的存放地了。
上传到 Github 上的是整个项目的源码,而上传到 bintray 上的是 pom, jar,arr 这类文件。
因此,在发布开源库到 JCenter 以前,咱们须要先在本地将要发布的 Module 打包成 jar, aar。那么,在本地要怎么操做呢?就像 Google 提供了 Android Gradle 插件来方便开发者直接对项目进行编译同样,bintray 也提供了相对应的 gradle 插件,来方便咱们直接在本地打包成 jar。
一样,Github 支持经过 Git 来将本地项目上传到 Github 上,而 bintray 也提供了对应的 gradle 脚原本让开发者将本地打包后的 jar 等上传至 bintray 网站上的仓库中。
这就是为何咱们须要在本地配置一些 gradle 插件的缘由,一者方便开发者对项目进行编译、打包成所需的文件;两者经过它提供的桥梁上传至 bintray 网站上的仓库。
使用 Android Gradle 插件,须要在根项目的 build.gradle 文件中配置:
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
复制代码
一样的道理,要使用 bintray gradle 插件,一样也得在根项目的 build.gradle 文件中配置:
dependencies {
//Android Gradle 插件
classpath 'com.android.tools.build:gradle:2.3.3'
//bintray 插件
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
//android-maven-gradle-plugin:1.3版本有bug,网上不少例子用的这个版本,编译的时候可能会出错,改一下版本就行了
}
复制代码
以上,只是配置了插件的路径,那么使用插件的地方确定就是在对应 module 下的 build.gradle 文件中了
gradle 插件使用的地方都是在每一个具体 module 下的 build.gradle 文件中:
apply plugin: 'com.android.library'
android {
...
}
复制代码
以上是常见的 build.gradle 文件,这表示的是,将会使用 Android gradle 插件中 id 为 com.android.library 的 gradle 插件来将该 Module 构建成一个 library,而 build.gradle 里其余配置项如 android 等则表示构建该项目所需的一些配置,这是我对 gradle 的理解(不知道对不对)。
一样,由于上传到 bintray 的是一些 pom, jar 文件,因此咱们也须要在这个 build.gradle 中使用 bintray 提供的插件来编译,打包项目:
//切记:如下代码必须放在 build.gradle 文件末尾
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
复制代码
以上 apply from 指的是该 module 须要使用一个存储于网上的 gradle 脚本文件来根据各类配置项来编译、打包项目。
之因此这个 gradle 脚本文件存储在网络上,纯粹是由于 bintray 担忧咱们不知道怎么使用它提供的 gradle 插件来生成 pom, jar 等文件,因此连模板脚本都提供给咱们了(这是个人理解)。
因此,你能够将 apply from 后面的连接在网页上输入看看,你会看到如下脚本:
//如下代码大概瞄一眼便可,不用细看
apply plugin: 'com.github.dcendents.android-maven'
group = publishedGroupId //开源库的 groupId
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'//将项目打包成 aar
groupId publishedGroupId
artifactId artifact
// Add your description here
name libraryName
description libraryDescription
url siteUrl
// Set your license
licenses {
license {
name licenseName
url licenseUrl
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
复制代码
这是一个将项目打包成 arr,并生成项目的 pom.xml 文件的脚本,这些文件都是要上传到 bintray 网站上你的仓库中去的。
因此,若是你知道使用 bintray gradle 插件都须要进行哪些配置的话,你彻底能够本身在 build.gradle 将上述脚本中所需的配置直接写上就好,不用使用 apply from;或者,你根据 apply from 后面的连接将脚本代码复制粘贴到 build.grale 文件中也行。
一样的道理,另一个 apply from 所提供的 gradle 脚本内容我就不截图了,那个脚本的做用是用于将生成的 pom, aar 等文件上传至你的 bintray 网站的仓库中去的。
也就是说,bintray 提供了两个 gradle 插件,一个用于将本地项目编译,打包成 aar,并生成所需的 pom.xml 等文件;另外一个用于将生成的这些文件都上传至你的 bintray 仓库中去。同时,bintray 还提供了两份脚本配置模板,若是不懂得怎么使用,就参照这两份模板来就好了。
既然提供的仅仅是模板文件,那么具体的配置项确定是须要咱们根据本身的实际项目来进行配置的。有两种方式:
Android Gradle 编译项目的用法其实就是第一种,但因为咱们对 android 项目编译要配置的项都挺熟悉了,加上 Android Studio 会自动生成一些必要的配置项,因此并不麻烦。但因为对 bintray gradle 插件的配置项不熟,我的不建议这里也使用这种方式。
而第二种方式,若是你有兴趣再去网上搜索下其余的这类教程的文章,可能你会发现,不少文章都会让你在 build.gradle 文件中写这么一段代码:
//下一步会具体来看每一个配置项含义
ext {
bintrayRepo = 'maven'
bintrayName = 'fb-like'
publishedGroupId = 'com.inthecheesefactory.thecheeselibrary'
libraryName = 'FBLike'
artifact = 'fb-like'
...
}
复制代码
如今能够理解,为何他们要你写这段代码了吧。由于 bintray 提供的脚本模板文件中,对它所需的配置项都使用了相对应的变量,那么咱们若是直接使用脚本模板文件,就须要对这些变量进行声明并赋值,也就是说在 ext 中 声明的 bintrayRepo, libraryName 等等这些变量,其实都是由于它们在 bintray 提供的脚本模板文件中被使用了。
另外,因为 gradle 脚本是按顺序执行代码,因此声明这些变量的代码必须在 apply from 代码以前,不然若是先执行了 apply from,会报找不到相对应的变量错误。
还有一点,bintray gradle 插件源码我没去深刻看,但要让项目生成对应的 pom 项目说明文件,以及打包成 aar,因此我猜想,这代表 bintray gradle 插件内部除了脚本模板上所列的各类配置项外,还须要 Android Gradle 插件的一些配置项,好比 build.gradle 里的 android 块配置项。
这也是为何其余文章里提到说,要将 apply from 这几行代码放在 build.gradle 最后的缘由。由于 gradle 脚本是按顺序执行代码,而 bintray gradle 插件的运行又依赖于一些 android 配置项,因此若是将 apply from 放在开头的话,会报找不到一些变量的错误。
若是不想让 build.gradle 文件中有太多跟编译项目自己无关的代码,那么能够将跟 bintray gradle 插件相关的代码都单独写在另一个 gradle 文件中,而后在该 build.gradle 开头经过 apply from 将那个 gradle 文件应用进来便可,有点相似于 import 的概念。
//build.gradle 文末
//bintray-config.gradle 就是跟 build.gradle 同层目录下的一个 gradle 文件,里面就是单纯将 exe {} 这块代码里的变量声明和赋值拷贝至 bintray-config.gradle 文件里
apply from: 'bintray-config.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
复制代码
第 2 步在于配置各类所需的 gradle 插件以及如何使用,至于脚本模板的每一行代码,感兴趣的能够去深究,但不去管也么事,反正大概知道两个脚本都干了什么事就行,怎么干的就不用去管了。
那么接下去就该了解一下,都须要对项目进行哪些属性的配置,这些插件才能够正常运行,才能够正常的将开源库上传至 bintray 上的仓库去:
ext {
//bintray 网站上你建立的仓库的名字(必配项)
bintrayRepo = 'base-module'
//在这个仓库下的 package name(必配项)
bintrayName = 'tv'
//以上两项均只是指向 bintray 网站上你的仓库和仓库下的package
//publishedGroupId:artifact:libraryVersion 构成你开源库的惟一路径
//例如:com.dasu.tv:tv:0.0.1,在build.gradle里就能够根据这个路径来compile依赖库了
//如下三项均是必配项
publishedGroupId = 'com.dasu.tv'
artifact = 'tv'
libraryVersion = '0.0.1'
//如下三项只是对开源库的描述(应该不是必配项吧,没尝试过)
libraryName = 'tv'
libraryDescription = 'dasu 封装的经常使用,可公用的 tvui 库'
siteUrl = 'https://github.com/woshidasusu/base-module/tree/master/tv'
//开源库对应的 github 地址,不知道可不能够不配,应该也是必配
gitUrl = 'https://github.com/woshidasusu/base-module.git'
//开发者信息,也是必配的吧
developerId = 'dasu'
developerName = 'dasu'
developerEmail = '295207731@qq.com'
//这部分能够不用改,我也不大懂这些开源协议,但应该都同样
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
allLicenses = ["Apache-2.0"]
}
复制代码
就像 build.gradle 文件同样,有些属性必须配置后项目才能够正常编译,运行。要使用 bintray gradle 插件来进行生成对应的 pom,aar 文件,上传到 bintray 仓库等功能,也必须进行一些属性配置才行。
总之,对应在 bintray 仓库的信息确定须要配置,发布到 JCenter 后的惟一路径也须要配置,开发者信息固然也须要,其余还须要一些开源库的描述信息以及开源协议信息。
常用 Github 确定还以为须要关键的用户跟秘钥信息是否是,不然使用 Git 上传项目到 Github 上时没办法进行身份验证。
一样的道理,要将通过 bintray gradle 插件生成的 pom,aar 等上传到 bintray 仓库,一样须要进行身份验证,那么就配置一些用户名和 key 的关键信息,但这些信息又极其敏感,隐私,因此只能配置在本地文件中。
若是不修改那两份脚本模板文件的话,那么这些信息就须要配置在项目的根目录下面的 local.properties 文件中:
//根目录下的local.properties文件
bintray.user= woshidasusu
bintray.apikey= XXXXXXX
复制代码
bintray.user 就是你的 bintray 网站的登陆帐号,若是你用 Github 受权登陆,就是你的 Github 帐号。
bindtray.apikey 须要进入 bintray 网站你的设置里去查看:
可能你在看别人写的教程文章时,会发现他们在这里还配置了一个
bintray.gpg.password=YOUR_GPG_PASSWORD
这个应该是用于将 bintray 上的开源库同步发布到 mavenCentral 仓库里的验证信息吧,反正我测试过,我没配置这个,仍是能够正常将本地开源库上传至 bintray 并发布到 JCenter 上面去。
好了,bintray gradle 插件咱们配置好了,它运行所需的各类属性咱们也配置好了,那么接下去就只是执行它而已了
若是本地有配置 gradle 环境的话,那么直接在 cmd 中以命令行的形式执行脚本便可。
若是没有配置 gradle 环境,那么每一个项目的根目录下都有个 gradle 文件夹,里面有 gradle 命名行执行所需的文件,因此能够直接在 Android Studio 的 Terminal 里直接以命令行的形式执行对应脚本便可,以下:
那么如何运行 bintray gradle 插件的脚本呢?只需记录两条命令便可:
gradlew install
用于将项目编译、打包生成 pom,aar 等文件;
gradlew bintrayUpload
用于将生成的 pom,aar 等文件上传至 bintray 仓库中;
跟编译、运行项目同样,当按顺序分别执行上述两条脚本命名时,若是运行成功,你能够在日志中看到 BUILD SUCCESSFUL
信息,一样,若是脚本运行出错,那么就须要根据日志查看是哪里的问题了,一般就是第 2 步跟第 3 步出了一些问题。
另外,你还能够经过在 build 文件夹下面查看是否有生成对应的文件来判断 gradlew install
脚本有没有成功执行。而后直接在 bintray 网站你的仓库里查看文件是否有上传来判断 gradlew bintrayUpload
脚本是否有成功执行。
接下去就是最后一步了,登陆你的 bintray 帐号,进入你的仓库里,找到上传的开源库,而后在页面右下角找到 Add to JCenter 按钮,点击进去,按照要求填写一下开源库说明,而后就静等几个小时,等收到 JCenter 发给你的审核经过邮件,那么就成功了。
那么这时候,你就能够愉快的在你的新项目中的 build.gradle 文件里直接经过 compile 来将你的开源库依赖到你项目中就能够了。
以上,就是怎么一步步的将本身的开源库打包发布到 JCenter 的步骤,小结一下,无外乎如下几点:
最后,还有一篇专门记录我本身在整个过程当中遇到的一些问题以及解决方法记录:
发布开源库到JCenter的一些问题记录