美文网首页
使用 gradle 和Nuexs 搭建分布式moudle依赖插件

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

作者: 王朋6 | 来源:发表于2019-05-05 17:45 被阅读0次

     编写此插件的问题背景

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

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

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

    之前的依赖

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

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

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

    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)

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

    可以使用浏览器打开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依赖插件

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