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

远程构件设计方案

作者: 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'
}

相关文章

  • 远程构件设计方案

    构件设计方案 前言 该方案的目的是为了阐述在组件化开发过程中,利用到远程构件的方式加载特定作用、固定内容的lib,...

  • Maven deploy 打包到远程仓库以及从远程仓库下载jar

    1、Maven deploy 打包到远程仓库 mvn deploy 用来将项目工程生成的构件分发到远程Maven仓...

  • 结构周记:时刻保持“平常心”。

    混凝土站构的设计方案应符合下列要求: 1.选用合理的结构体系、构件形式和布置。 2.结构的平、立面布置宜规则,各部...

  • Bintray项目发布-基础

    前言 发布项目的定义。发布项目到远程JCenter仓库,准确的说是发布项目构件到JCenter仓库,用英语说是Pu...

  • Maven私服Nexus的搭建

    私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven...

  • 使用Nexus搭建Maven私服

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 M...

  • 四、Maven仓库

    一、JFrog的仓库类型 1. 本地仓库 本地仓库是本地管理的物理仓库,可以deploy构件。 2. 远程仓库 远...

  • linux环境下使用nexus搭建maven私服

    1、私服简介: 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。我总结下来有三点好处:...

  • Maven 从仓库解析依赖的机制

    当本地仓库没有依赖构件的时候,Maven 会自动从远程仓库下载;当依赖版本为快照版本的时候,Maven 会自动找到...

  • 搭建Maven私服-Nexus

    Maven 私服,可以代理远程仓库和部署自己或第三方构件。本文介绍使用最广泛搭建 Maven 私服的工具: Son...

网友评论

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

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