组件化

Android组件化--不一样的公共依赖管理方案

2019-07-15  本文已影响0人  Mlxff

需求分析

最近在公司搞组件化,发现跟一般的只是在project的build.gradle中定义版本号或者单独定义一个gradle文件来管理所有版本号。
但是这样做还有一个问题:

1、 project的build.gradle中定义管理的话,会导致build.gradle文件很大,整体感觉有些凌乱。

2、单独定义的版本管理的gradle文件虽然统一了版本号,但是各个module的依赖还是要重复写,并且替换第三方依赖的时候,要修改每个module的build.gradle文件。当然也可以把整个依赖全称配置好,如下:
versions.gradle文件

ext.deps = [:]

def deps = [:]
//
deps.room_runtime = 'androidx.room:room-runtime:2.0.0'
deps.room_compiler = 'androidx.room:room-compiler:2.0.0'
deps.room_rxjava2 = 'androidx.room:room-rxjava2:2.0.0'
deps.room_guava = 'androidx.room:room-guava:2.0.0'
deps.room_testing = 'androidx.room:room-testing:2.0.0'
ext.deps = deps

再在project的build.gradle中引入文件:

apply from: 'versions.gradle'

然后就可以在module的build.gradle中直接引用了

  //room
    implementation deps.room_runtime
    annotationProcessor deps.room_compiler
    implementation deps.room_rxjava2
    implementation deps.room_guava
    testImplementation deps.room_testing

3、 但是上面这么做,做统一版本管理和修改版本号都很简单,只要修改versions.gradle文件对应项就好了。但是,要是出现需要删除一些旧的依赖库或者添加新的依赖库还是要四处修改。这种机械的重复劳动是一个android开发不能忍受的。所以有了以下方案:

正题来了:

简单一点,我们为什么不能把添加公共依赖的代码放到一个公共方法里,让每个module的build.gradle中的dependencies {}中直接调用这个方法不是更好?像下面这样:

dependencies {
    rootProject.allModuleDependencies(dependencies)
}

要做到这一点:

1、 我们先自定义一个文件取名dependencies.gradle,在里面定义公共依赖方法:

static def allModuleDependencies(DependencyHandler dependencyHandler) {
    //room
    dependencyHandler.implementation 'androidx.room:room-runtime:2.0.0'
    dependencyHandler.annotationProcessor 'androidx.room:room-compiler:2.0.0'
    dependencyHandler.implementation 'androidx.room:room-rxjava2:2.0.0'
    dependencyHandler.implementation 'androidx.room:room-guava:2.0.0'
    dependencyHandler.testImplementation 'androidx.room:room-testing:2.0.0'
}
ext.allModuleDependencies = this.&allModuleDependencies

2、 然后在project的build.gradle的buildscript中添加代码如下:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    apply from: 'dependencies.gradle'
}

3、 然后就可以在module下直接调用这个方法啦:

dependencies {
    rootProject.allModuleDependencies(dependencies)
}

还可以吧。

另外说明,DependencyHandler这个类的路径:


image

windows直接ctrl+鼠标左键直接能跳转查看


image

有空可以看看gradle源码哦

上一篇 下一篇

猜你喜欢

热点阅读