构件设计方案
前言
该方案的目的是为了阐述在组件化开发过程中,利用到远程构件的方式加载特定作用、固定内容的lib,促进产品组件化的发展。
构件的意义
- 构件是面向软件体系架构的可复用软件模块。构件与业务模块的区别在于,构件可以是没有业务属性的功能模块,构件具有独立性、复用性、可集成等特点。
- 在团队开发中多项目并行、多人协作等工作模式下,对基础组建资源开发库有严格的更新要求,为了解决上述的需求,于是为基础开发库创建仓库lib,所有协作人员引用该仓库组件,组件库的一次迭代更新的影响范围是产品级的。
- 在组件化打包的背景下,在app壳工程层级之中,有需求去维护一套规范的资源文件,达到各产品定制化的需求。同时壳工程中需要植入配置文件,这两项需求也可以通过,创建仓库lib来维护,壳工程只需要引用该lib的arr发布版本即可完成编译,远程仓库的一个版本更新意味着一次产品的发布。
如何发布一个构件
第一步:选择仓库类型目前在android项目中,主流的两个标准的代码仓库是:Maven,Jcenter。
因为我们的项目不是一个开源项目,我们也没有必要将我们的项目源码推送到远程服务器,远程服务器上的仓库lib会有同步速度一般不是很快。所以我们着手搭建一个本地的Maven仓库,Jcenter本地仓库的相关信息未搜索到。
第二步:搭建环境
为什么是ARTIFACTORY?
虽然有一些其他的选项可供选择,我个人选择 artifactory 因为:
- 清晰且有吸引力的用户界面
- 超快速配置
- Gradle插件
- 用户访问控制
- 自由和开放来源
下载压缩包,执行(管理员权限)相对应的artifactory.[脚本类型]。
命令行下会出现:
Artifactory successfully started.
第三步:向本地仓库中提交一个项目
假设你有了一个工程项目 CommonRepsoitory:
其中localtest是我们要上传的测试lib。
- 在根目录的build.gradle中添加如下代码:
dependencies {
classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.1.1'
}
- 在lacaltest model下添加一个gradle文件,假设名字暂为:local-maven.gradle
文件内容如下:
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
def artifactVersion = '1.0.1'//release包发布的版本
//def artifactVersion = '1.1-SNAPSHOT'//snapshot包发布的版本
//def artifactory_contextUrl = "http://192.168.0.171:8081/artifactory"
def artifactory_contextUrl = "http://192.168.0.171:8081/artifactory"
def artifactory_user = "admin"
def artifactory_password = "password"
publishing {
publications {
aar(MavenPublication) {
groupId = 'com.maowo'
artifactId project.name
version = artifactVersion
artifact "${project.buildDir}/outputs/aar/${project.name}-release.aar"
}
}
}
artifactory {
contextUrl = artifactory_contextUrl
publish {
repository {
// The Artifactory repository key to publish to
repoKey = artifactVersion.endsWith('SNAPSHOT') ? 'libs-snapshot-local' : 'libs-release-local'
username = artifactory_user // The publisher user name
password = artifactory_password// The publisher password
maven = true
}
defaults {
publishArtifacts = true
publications('aar')
publishPom = true //Publish generated POM files to Artifactory (true by default)
publishIvy = false //Publish generated Ivy descriptor files to Artifactory (true by default)
}
}
// resolve {
// repository {
// repoKey = 'jcenter'
// username = artifactory_user // The resolver user name
// password = artifactory_password // The resolver password
// }
// }
}
- 文件中的一些重要概念:
每一个Maven artifact都由以下三个参数确定:
* artifactId:库的名称
* groupId:通常库的包名
* version:区别同一artifact的不同版本
一般的,我们将在build.gradle文件定义最后两个变量。
def packageName = 'com.jeroenmols.awesomelibrary'
def libraryVersion = '1.0.0'
artifactId 需要和 assemblerelease 任务输出的文件名相匹配。因此我们要 重命名库模块 或 指定输出文件名 。我个人比较喜欢第一种方法,可以通过下面这种方式得到 artifactId :
project.getName() // the ArtifactId
现在我们需要配置 maven-publish ,这样就知道哪一个artifactory将发布到Artifactory。我们的目的,我们是引用 ***-release.aar 文件,他是由 assemblerelease`任务生成。请注意,我们可以通过更改库项目名称来预测这个名称:
publishing {
publications {
aar(MavenPublication)
{
groupId packageName
version = libraryVersion
artifactId project.getName()
// Tell maven to prepare the generated "* .aar" file for publishing
artifact("buildDir/outputs/aar/{project.getName()}-release.aar")
}
}
}
最后,我们需要配置 com.jfrog.artifactory 插件,来指定artifact发布到的库。为简单起见,我们将上传一个artifact到本地运行的Artifactory实例( http://localhost:8081/artifactory ),默认放在 libs-release-local 库中。请注意,在本例中,用户名 admin ,密码 password 是硬编码的形式。我们希望以后有一个更好的解决方案。
artifactory
{
contextUrl = 'http://localhost:8081/artifactory'
publish {
repository {
// The Artifactory repository key to publish to
repoKey = 'libs-release-local'
username = "admin"
password = "password"
}
defaults {
// Tell the Artifactory Plugin which artifacts should be published to Artifactory.
publications('aar')
publishArtifacts = true
// Properties to be attached to the published artifacts.
properties = ['qa.level': 'basic', 'dev.team':'core']
// Publish generated POM files to Artifactory (true by default)
publishPom = true
}
}
}
部署ARTIFACTS
现在,我们通过配置Gradle的buildscripts,运行以下命令轻松部署artifactory:
gradle assembleRelease artifactoryPublish
使用ARTIFACTS
为了保证另一个项目也可以引用这个artifact,我们需要在根目录下的 build.gradle 文件中,把我们的仓库信息添加到仓库列表中。
allprojects {
repositories {
maven { url "http://localhost:8081/artifactory/libs-release-local" }
}
}
然后,我们只需要在主工程的 build.gradle 文件中添加artifact作为依赖就可以了:
dependencies {
compile 'com.maowo.localtest:1.0.0'
}
网友评论