1. 前言
大多数情况下我们依赖第三方库都是直接在dependencies中直接引用,在引入少量且不是多个地方引用是没有问题的,但是一旦某一个开源库在多个地方引用,且每个地方引用的版本都不一致的时候,就只在是难以维护了。
在前面讲过,Gradle是Groovy语言编写的,既然是语言,那么我们可以不可以像Java那样将引入配置抽取成为一个常量配置呢?答案是肯定的,要不然这篇文章也没有继续写下去的必要。
![img_6fe42b43370195b994eeb5ac755da1f2.png](https://i-blog.csdnimg.cn/blog_migrate/2a901b97bab8e3240d3ac1fba36c6369.png)
2. 统一依赖配置
2.1. 创建配置Gradle
在项目的根目录,也就是setting.gradle的同级创建一个【config.gradle】的文件,这个文件就是我们用来做相关配置的文件了。
![img_9d60ac236f0e4c24a70a280edf9c0359.png](https://i-blog.csdnimg.cn/blog_migrate/c7b662a960f1b615351498738b957e63.png)
2.2. 引入配置Gradle
配置文件创建成功,需要在根目录的build.gradle中进行引用,这一步就像我们的导包。
apply from: "config.gradle"
如图:
![img_28e18e4b1dcad22c813adb3697af0a50.png](https://i-blog.csdnimg.cn/blog_migrate/5a85b7e6a2c4b1cb041d9669a44b4c43.png)
2.3. 配置Gradle说明
配置文件引入完毕,我们就可以进行相关依赖的配置了,原理是用了project中ExtraPropertiesExtension的ext属性来完成的,ext接收一个闭包,闭包内可以写任意属性,相当于增加了一个拓展属性,在需要的地方直接调用【rootProject.ext.属性名】就可以直接调用。
![img_1e179df262b54ecf1c399082057f60bd.png](https://i-blog.csdnimg.cn/blog_migrate/2c0bf8e7e8a7ddb8f54520b258af84e4.png)
2.4. 编写ext内容
先编写基础的内容:
ext {
// 创建一个 dependencies集合,存储的内容为 "key" : "value"
dependencies = []
}
![img_b785c94c4e5afb372cf64d1aa8253df5.png](https://i-blog.csdnimg.cn/blog_migrate/7d4ecd089ed5ba6107a4922a69c83b70.png)
先看看原始dependencies,为了方便,这里就只加了一个v7包
![img_bd111b0e2f3181bd4cd9070c8ad21337.png](https://i-blog.csdnimg.cn/blog_migrate/7e83dbe75a3667c59b48565645819190.png)
我们将v7包的引入迁移到config.gradle,dependencies中存储的数据是key/value形式的,就是Java中的map集合。
ext {
// 创建一个 dependencies集合,存储的内容为 "key" : "value"
dependencies = ["appcompat-v7": "com.android.support:appcompat-v7:26.1.0"]
}
然后再core-library/build.gradle进行引用:
dependencies {
// 从config.gradle中引用
implementation rootProject.ext.dependencies["appcompat-v7"]
}
如图:
![img_e3d866d0cfc5673ed957a7ee6bdc197f.png](https://i-blog.csdnimg.cn/blog_migrate/3f3e381147ac067a6995344dec8925d0.png)
至此,简单的抽取配置就完成了,是不是文章到此结束?当然不是,我们需要有散发精神,我们的gradle中不是有compileSdkVersion等等之类的吗?其实我们也可以将他们抽取出来,做统一的管理。
2.5. 抽取其他属性
看下图,我们的目标是将图中的这些属性抽取到config.gradle中去。
![img_0ba9d8a330e407269539ce5a458b942b.png](https://i-blog.csdnimg.cn/blog_migrate/ef7eb942cb1dfff5d90d578e19681387.png)
我们在config.gradle中再创建一个android集合,用来存放变量,然后将变量存储进去:
ext {
android = [compileSdkVersion : 26,
minSdkVersion : 18,
targetSdkVersion : 26,
versionCode : 1,
versionName : "1.0"
]
// 创建一个 dependencies集合,存储的内容为 "key" : "value"
dependencies = ["appcompat-v7": "com.android.support:appcompat-v7:26.1.0"]
}
然后再build.gradle中进行替换引用:
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
defaultConfig {
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
}
}
在进行一下对比:
![img_5283ddf3d99525590279239afd55204f.png](https://i-blog.csdnimg.cn/blog_migrate/2cde5dcf6caf4150bce7b5ca3acd6a95.png)
这样的话,以后不管有多少个module,都能够进行统一的版本,sdk的配置。
2.6. 拓展
其实我们的signingConfig也是可以抽取出来统一配置,都是依葫芦画瓢,就不再累述了。
3. 最后
未完待续、敬请期待!
免为其难的关注一下公众号吧!!
![img_f0790f8ed7e67ea3b5a4d6bc3f65b0aa.png](https://i-blog.csdnimg.cn/blog_migrate/5a5e0eee324116b4e60da8b48bfd64d2.png)
![img_b246dc41a34e6fdd3598d113e0f65194.jpe](https://i-blog.csdnimg.cn/blog_migrate/f4af4a196e089899934af4c1db4dc91c.jpeg)