使用 gradle 和Nuexs 搭建分布式moudle依赖插件

 编写此插件的问题背景

工程日益增大后,为了更好的维护性,会将公用部分抽成模块放在工程中进行开发,但是多模块开发的编译速度一直是Android开发的诟病.于是综合各种技术情况,设想出了一套分布式开发和项目依赖的开发架构,经过两个星期的反复论证与实践最终使用Gradle插件和Maven私服技术将设想变为现实.

下面我们用两张图对两种开发方式进行对比:

  首先是之前模块依赖开发方式,A、B、C三个模块同在一个工程中,A依赖B,而B依赖C,这种方法虽然也实现的了模块式的开发,但是由于三个模块同在一个工程中,任何一个模块的一行代码修改都会导致其它两个模块的重新编译,严重影响了编译速度,降低了开发效率。除此之外,三个模块的代码同在一个工程中,测试时只能打包成ApK,对整个工程进行测试。

使用 gradle 和Nuexs 搭建分布式moudle依赖插件_第1张图片
之前的依赖

下面则是现在设计的分布式开发依赖图例:

       开发中将公用模块单独建立一个工程进行开发,开发完成测试通过后,打包成对应的镜像,利用网络将其发布到内网中的服务器上,其它工程对其依赖时只需要从服务器上进行自动的下载依赖,从而实现分布式开发和依赖.

使用 gradle 和Nuexs 搭建分布式moudle依赖插件_第2张图片

上述开发方式显著的优点有:

1、由于A、B、C三个模块不再放在同一个工程中开发,而是各自独立出来成为一个工程,如果其中一个模块有代码修改不会影响到其它两个模块,直接提高了编译速度

2、并且模块独立成一个工程,测试时就可以针对单独的一个模块进行测试,细化了测试粒度,更容易测出潜在问题

3.所有模块之间面对远程库编程,而模块之间没有任何代码上的耦合,可以做到分布式开发,让人力更均匀的分布到项目的各个地方,并且通过对某几个核心模块的加密再加上Maven的权限管制,可以实现核心代码的保密不泄漏.

涉及到的技术

1、Nuexs搭建内网的Maven库服务器(保证了安全性)

2、自定义Gradle插件,将发布、加密、下载、依赖等动作封高度封装在插件内,调用只需简单两行代码,使使用者无需掌握Gradle流程和Groovy语法

3、Gradle编译流程的hock

一、插件的发布使用方式:

1、新建一个工程A,用以单独开发新的A_m模块,并在A工程的根build.gradle文件中加入一下代码

buildscript {

  repositories {

   jcenter()

   maven {

    url 'http://192.168.19.102:8089/nexus/content/groups/public/'

    }

           dependencies {

             classpath    'plugin.ytc.wpplugin:uploadmaven:1.0.0'

          }

}

2、在需要发布到Maven上的A_m模块的build.gradle文件中添加如下代码:


// 首先引入咱们的发布插件

apply plugin:'ycf.wangpeng.mavenmanage'

// 配置发布库版本等信息

publishMaven{

  publish false

  localMaven rootDir.absolutePath+'/Arrrrrrs'

  group =  'com.pulgin.test'

  version = "1.1.1"

  type = "aar"

  moudleName = "publishTest"

}

3、Rebuild一下A_m模块工程,然后在studio右侧工具会出现发布工程的转用任务条uploadArchives,点击运行(途中测试的模块是test2)


使用 gradle 和Nuexs 搭建分布式moudle依赖插件_第3张图片

当看到一下下面uploadArchives任务BUiLD SUCCESSFUL时,说明项目已经发布到远程服务器上

使用 gradle 和Nuexs 搭建分布式moudle依赖插件_第4张图片

可以使用浏览器打开http://192.168.19.102:8089/nexus/content/groups/public,验证是否可以找到刚才上传的包

二、插件的依赖使用方式:

上面,我们已经发布成功了模块,现在我们一个B工程中进行使用

1、首先在B工程中需要依赖刚才发布到服务器上的库的模块中添加一下代码:

  apply plugin:'ycf.wangpeng.mavenmanage'

2、在模块中的依赖表中配置刚才发布成功的模块的groupId、modleName、版本号:

dependencies {

   compile “groupId:modleName:version@aar”  

   // 例如:compile “com.ytc.depofMaven:testmodle:1.1.2@aar”

   // 如果所依赖的模块是以aar方式依赖,也就是说不会依赖它的子依赖,关闭了其传递性的依赖,不带aar则会连它的传递性依赖都依赖下来

}

上述配置完毕,同步工程,B工程就会从内网中的Maven服务器上拉取刚才的代码进行依赖运行

注意的问题:

现在的插件记录所发布的模块的第三方依赖,但是却无法打包模块依赖的其它的module,如果所发布模块C依赖其它module(D)的,需要将让module D也按照上述方法进行发布,然后将依赖compile project(":module")修改为compile "D发布的groudId :  D模块的名字: D发布的版本号"

当依赖了multidex或者multiDexEnabled true开启multidex,则会引起

FAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':...:uploadArchives'.> Could not publish configuration 'archives' > Could not write to file '/Users/billy/Documents/android/.../build/poms/pom-default.xml'.

解决方法则是,在build文件中去掉multidex有关的一切

待开发内容:

1、支持模块嵌套的发布

2、最新版本自动提醒。如果有一个module发了新版本,会在日志中提示那个依赖有最新版发布,新的版本号;

你可能感兴趣的:(使用 gradle 和Nuexs 搭建分布式moudle依赖插件)