使用AS经常会创建很多通用的库,可能有很多工程会依赖,一般有几种办法在其他工程依赖:
- 直接imports库的对应模块。
- 在本地创建maven仓库,其他项目通过本地仓库引用。
- 小型团队在局域网使用nexus3搭建私有maven仓库。
- 将库发布到jCenter / Maven Central。
使用以上四种都有一些缺点,前三种只能在本地或者局域网,第四种可以最大化实现共享,但是发布到jCenter / Maven Central速度非常慢等。是不是有其他方法呢?
有。用Gitee/GitHub可以实现,因国内GitHub访问速度也是很慢,以Gitee和Android studio为例。其实现思路为:
1、 AS生成本地库
2、上传Gitee/GitHub仓库
3、AS其他项目依赖Gitee/GitHub仓库
Android Studio 生成本地库
在对应模块的build.gradle增加如下内容
apply plugin: 'maven'
uploadArchives {
repositories.mavenDeployer {
// 本地仓库路径
repository(url: 'file://D:/repository/')
// 唯一标识
pom.groupId = "com.example"
// 模块名称
pom.artifactId = "test"
// 版本号
pom.version = "1.0.0"
}
}
使用命令一步生成所有库到本地仓库
gradlew uploadArchives
使用AS单独生成某个库到本地仓库,如图所示点右键 run生成。
上传Gitee/GitHub仓库
在Gitee/GitHub创建一个仓库,如maven_repo,再进入本地仓库“D:/repository”,可以使用以下命令上传到远程仓库。
cd D:/repository
git init
git add .
git commit -am "XXXXXXX"
git remote add origin <Gitee/GitHub 仓库地址>
git push origin master
AS其他项目依赖Gitee/GitHub仓库
获取Gitee/GitHub仓库的原始文件URL。
Gitee为https://gitee.com/<用户名>/<仓库名-maven_repo>/raw/<分支-master>
Github为https://raw.githubusercontent.com/<用户名>/<仓库名-maven_repo>/<分支-master>
配置项目build.gradle,增加maven仓库地址,如下所示:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
maven{url 'https://gitee.com/XXXXX/mvn_repo/raw/master'}
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven{url 'https://gitee.com/XXXXX/maven_repo/raw/master'}
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
下一步在app的build.gradle依赖库
implementation 'com.example:test:1.0.0'
至此Gitee/GitHub 创建私人Android studio库的 Maven 仓库已经完成。但是测试时发现如果Gitee/GitHub 创建是私有库,按如上配置无法成功下载test库,所以目前只能支持公开库才能下载。
Android Studio 生成本地库到当前项目目录
再深思另一个问题,项目生成库到本他仓库,需要再用git命令再上传到远程仓库,哪我是否可以直接将本地仓库建立在项目的目录下,这样生成的库可以直接用AS或者命令一步上传远程仓库,修改maven的url地址。
apply plugin: 'maven'
def repository_url() {
File file = new File(getRootDir().getAbsolutePath() + File.separator + "repository")
return file.toURI().toURL()
}
uploadArchives {
repositories.mavenDeployer {
// 本地仓库路径
repository(url: repository_url())
// 唯一标识
pom.groupId = "com.example"
// 模块名称
pom.artifactId = "test"
// 版本号
pom.version = "1.0.0"
}
}