远程构件设计方案

构件设计方案

前言

该方案的目的是为了阐述在组件化开发过程中,利用到远程构件的方式加载特定作用、固定内容的lib,促进产品组件化的发展。

构件的意义

  1. 构件是面向软件体系架构的可复用软件模块。构件与业务模块的区别在于,构件可以是没有业务属性的功能模块,构件具有独立性、复用性、可集成等特点。
  2. 在团队开发中多项目并行、多人协作等工作模式下,对基础组建资源开发库有严格的更新要求,为了解决上述的需求,于是为基础开发库创建仓库lib,所有协作人员引用该仓库组件,组件库的一次迭代更新的影响范围是产品级的。
  3. 在组件化打包的背景下,在app壳工程层级之中,有需求去维护一套规范的资源文件,达到各产品定制化的需求。同时壳工程中需要植入配置文件,这两项需求也可以通过,创建仓库lib来维护,壳工程只需要引用该lib的arr发布版本即可完成编译,远程仓库的一个版本更新意味着一次产品的发布。

如何发布一个构件

第一步:选择仓库类型目前在android项目中,主流的两个标准的代码仓库是:Maven,Jcenter。

因为我们的项目不是一个开源项目,我们也没有必要将我们的项目源码推送到远程服务器,远程服务器上的仓库lib会有同步速度一般不是很快。所以我们着手搭建一个本地的Maven仓库,Jcenter本地仓库的相关信息未搜索到。

第二步:搭建环境

为什么是ARTIFACTORY?

虽然有一些其他的选项可供选择,我个人选择 artifactory 因为:

  • 清晰且有吸引力的用户界面
  • 超快速配置
  • Gradle插件
  • 用户访问控制
  • 自由和开放来源

下载压缩包,执行(管理员权限)相对应的artifactory.[脚本类型]。

命令行下会出现:

Artifactory successfully started.

第三步:向本地仓库中提交一个项目

假设你有了一个工程项目 CommonRepsoitory:

其中localtest是我们要上传的测试lib。

  1. 在根目录的build.gradle中添加如下代码:
dependencies {
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.1.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
//        }
//    }
}
  1. 文件中的一些重要概念:

每一个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'
}

你可能感兴趣的:(远程构件设计方案)