阅读 458

【奇技淫巧】子 module 的 build.gradle 中没有一行代码?多项目构建技巧

前言

之前写过两篇关于管理项目中依赖本的文章:

什么?项目里gradle代码超过200行了!你可能需要 Kotlin+buildSrc Plugin

【奇技淫巧】除了 buildSrc 还能这样统一配置依赖版本?巧用 includeBuild

Android Detail 项目 目前使用的是第二篇提到的方式。

主工程(Android-Detail)与一个版本控制插件(version)通过组合构建(composing builds)进行管理。

今天我们来谈一谈在这种方式的基础上如何抽取公共配置,使得 build.gradle 文件的内容尽可能少,甚至内容可以为空。

阅读本文,你将了解:

  • 如何抽取 build.gradle 文件中的公共配置
  • 如何一键切换本地 module 与远程依赖

Demo 在这

抽取 android 闭包的配置

Android Detail 下除了 baselib 是 library module,其它都是 app module。app module 中有很多相同的配置,如下图:

我们可以为 BaseExtension 写一个扩展函数,名字叫 applyBaseCommons。在该方法中,我们配置 android 闭包下的公共配置,例如 compileSdkVersionversionCode 等。

接着,我们在 version plugin 中调用该方法,即可为所有 module 配置 android 闭包内的公共配置。

抽取公共依赖

每个 app module 都有着公共的依赖,如 test 相关的依赖,Kotlin 标准库的依赖,并且同时引用了 baselib module

按照上面的思路,我们可以再一个配置依赖的扩展函数

接着在在 version plugin 中调用该方法

抽取公共插件

每个 app module 都有 kotlin-androidkotlin-android-extensions 两个插件

遵循上面的思路,我们再写一个配置公共插件的扩展函数

到目前为止,app module 中只有两行内容

有着严重强迫症的我十分想将这两行消灭掉。

可以实现吗?

必须可以!

我们都知道 project 下的 build.gradle 中有一个 allprojects{} 闭包,我们可以在其中为所有 project 统一配置内容。

其实还有一个 subprojects{} 用于为子 project 统一配置内容。我们可以在该闭包内为所有 module 配置 version plugin,为 baselib 配置 com.android.library plugin,为其余的 app module 配置 com.android.application plugin

为了使 project build.gradle 能够找到我们的 version plugin,还需使用 plugins{} 声明一下,apply 设置为 false

当然,判断使用 application/library plugin 的判断条件可以根据自身情况配置,例如所有带 lib_ 前缀的 module 使用 library plugin

使用组合构建切换远程依赖/本地module

组合构建可以将多个 project 一起构建,例如我在 Android-Detail 的 settings.gradle 通过 includeBuild 关键字引入了我的 另一个项目,该项目已发布到 Jitpack,可以使用 com.github.Flywith24:Flywith24-Permission:1.0.1 引入

此处根据环境变量 useLocal 来判断是否 includeBuild permission 项目,如果为 false ,则使用远程依赖,如果为 true,则会使用本地 module :library

一键切换远程依赖/本地module 的其它姿势

在 project 使用前文类似的配置,也可实现一键切换远程依赖/本地module 的功能

这样调试阶段就不需要频繁的发快照包啦~

关于我

我是 Flywith24,我的博客内容已经分类整理 在这里,点击右上角的 Watch 可以及时获取我的文章更新哦 😉