美文网首页
远程构件设计方案

远程构件设计方案

作者: 8bc18a303943 | 来源:发表于2017-06-13 11:11 被阅读41次

    构件设计方案

    前言

    该方案的目的是为了阐述在组件化开发过程中,利用到远程构件的方式加载特定作用、固定内容的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'
    }

    相关文章

      网友评论

          本文标题:远程构件设计方案

          本文链接:https://www.haomeiwen.com/subject/gnxdqxtx.html