相信很多人都发现了,github上很多优秀的开源项目都是以一种组件化的方式来写的,都是直接通过gradle的compile把一个jar包或者aar包引用过来供项目里的代码来使用的。这其实就是把你写好的一个模块放到私有库上,然后直接引用的道理。那么肯定会有很多人有这样的疑惑:AndroidStudio里不是有一个module的概念吗,module不仅可以在其他项目里复用,我只要import一下就可以了,而且还方便修改,万一哪天需求突然变了,那修改起来不是很方便吗!没错,这个也是主管让我去做私有库时候我的第一反应,我觉得module有很强大的优势啊,为什么还要去花精力去做私有库呢!但主管的一句话说服了我,具体怎么说的我忘记了,我就说我理解的吧:私有库的用途是让你在开发其他app时候需要这个模块的时候就直接引入这个模块,而模块的作用相当于一个零件,如果通过module的形式,很容易造成,这个项目里加了方法,改了方法,那个项目里没改,或者改了其他的方法,这样子的形式来作为模块的话当然是不够优秀的。所以,我们要搭建私服,用的最多的就是我要介绍的Nexus了。
首先,你可以在本地先搭个Nexus试试,下载地址:点击打开链接
Nexus 3.xx直接下载.dmg或者.exe即可。Nexus 2.xx则需要下载安装包,然后进行一大堆的配置,具体配置读者可以去自行谷歌或者百度。直接.dmg下载下来很方便噢。噢,安装之前要确保电脑上是否安装了JDK,如果没有安装,那么得先去安装JDK。
安装3.xx的同学安装完以后,打开,进入是这样子的界面:
安装2.xx的同学进去是这样的,我也去试了一下:
个人觉得3.xx界面上来说友好多了,但是仓库设置稍微有点难找。。。下面均以3.xx为例子讲解,点击右上角的登录,默认账户名密码是admin/admin123。登录进去以后,左上角会有个设置按钮,(有时候会没有,我估计是bug吧,所以很难找,一开始我愣是没找到),进去以后,左边有个Repositories,你会发现已经有很多个仓库建好了,如图:
每个仓库都有自己的属性,选择一个仓库就可以查看这个仓库的一些具体信息。我们的目的主要是把我们的项目代码发布到这些仓库里去,既然要发布到这些仓库上去,我们就不想我们的代码外泄出去,那我们就要选择hosted类型的仓库,hosted类型是Nexus oss所在自己本地的服务器上的仓库,比较安全。我们进行操作的时候,其实最主要的还是maven-releases和maven-snapshots两个仓库,这两个仓库有什么区别呢?只是一个Deployment Policy部署协议上的区别,maven-releases上的是Disable Redeploy(不允许重复部署),意思就是部署上去的就是正式版本的库,如果之后更新lib只能以更新版本号的形式操作。而maven-snapshots则是Allow Redeploy(允许重复部署),顾名思义,就是不需要更新版本号,只要groupId,artifactId,version相同就可以进行覆盖,一般用于你的module还没进行完全测试的时候。其实一般项目开发中module中的写的方法都可以在项目中直接引用测试,测试通过以后再上传到私有库上,再加上开发进度比较紧,所以我开发中一般不太上传到snapshots上。。。当然从程序严谨程度上还是有必要进行这一步的。。。这里主要考虑到了成本问题。
仓库搞好了,之后我们就要把我们的代码上传到私有库上了,首先新建一个Android项目,然后new module,在module的bulid.gradle里添加下面配置:
apply plugin: 'maven'
def isReleaseBuild() {
return VERSION_NAME.contains("SNAPSHOT") == false
}
def getRepositoryUsername() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: RELEASE_REPOSITORY_URL) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
}
}
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
然后在该module目录下添加grade.properties配置文件:
GROUP=//.........
VERSION_NAME=1.0.0
POM_ARTIFACT_ID=//.........
SNAPSHOT_REPOSITORY_URL=//....
RELEASE_REPOSITORY_URL=//....
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
其中GROUP为对应的groupId,看build.gradle就可以知道这里的逻辑是如果groupId名字中包含SNAPSHOT字符,module就发不到snapshots仓库里,否则发布到releases仓库。VERSION_NAME就是对应的版本号,记住发到releases仓库上的项目更新以后版本号要加上去。POM_ARTIFACT_ID就是对应的artifactId值。在私有库中,你的项目是以group:artifactId:version的形式存放的。接下来两个url就是对应snapshots和releases的仓库地址。如果你是本地搭建的nexus,如果你是mac,在终端中输入ifconfig命令行就可以知道你的ip地址了。
配置完毕,在AndroidStudio右边的Gradle面板中找到对应的module,然后在upload里有一个uploadArchive选项,双击就可以了,然后就build success了!私有库上传成功!
私有库上传成功以后,我们就可以在所有项目中直接引用这个私有库了。引用的方法很简单,在项目的build.gradle里allprojects下添加:
maven{
url("http://192.168.20.78:8081/repository/maven-releases/")
}
然后就可以在app目录下build.gradle里直接compile就可以了,记住格式,group:artifactedId:version,就像这样:
compile 'com.cgtz.test:test:1.0.0'
具体公司项目开发中,新创一个git的项目,在这个项目中新建module上传私有库,并可以在app里对各个方法进行测试,至此,私有库的玩法就介绍完毕了.