背景
在 Android App 的成长过程中,随着包性能越来越多,团队越来越简单,为了保障性能的清晰和可维护性、减少模块的内聚性,减小 git
推代码抵触的危险等等,App
的开发模式会缓缓变成集成开发模式
集成开发模式
每个人负责一个或者多个模块,模块之间互相隔离,独立进行打包和降级,最初以远端依赖的形式集成到 App 中进行打包
问题
在采纳集成开发模式的时候会碰到一个问题,因为主 App 都是通过implement
远端的依赖进行打包的,当在本地开发的时候,如何对模块的本地代码进行调试呢?个别咱们的做法是这样的:
- 在 build.gradle 中将远端的依赖改为本地依赖
- 在 setting.gradle 中定义本地依赖的模块地址
// build.gradle 文件
dependencies {
// 在主 App 中是这么定义依赖的
implementation 'io.github.pettywing:floatwindow:1.0.0'
// 当业务在本地开发的时候改为
implementation project(':floatwindow')
}
// setting.gradle 文件
include ':floatwindow'
project(":floatwindow").projectDir = file("../floatwindow/floatwindow")
但这样设置很麻烦,危险也很高,每次我的项目拉到本地都要改一次,到远端打包的时候还要在批改回来,有没有啥简略的办法呢
解决
在本地新建一个 local_develop.gradle 文件,并增加到 git.ignore
ext {
dependencies = [
[
// 是否开启模块的本地源码依赖,true 则源码依赖,false 则 AAR 依赖
isLocalModule: true,
// 代码仓库寄存在本地之后绝对主工程的门路,因为我放在了主工程的同级目录,所以这里要的相对路径要跳出一级目录
projectPath : "../../android/Floatwindow",
// module name
projectName : ":floatwindow",
// maven groupId:artifactId
projectMaven : "io.github.pettywing:floatwindow"
]
]
}
在 setting.gradle 增加如下代码
File localPropertiesFile = new File(rootDir.getAbsolutePath() + "/local.properties")
File localDevelopFile = new File(rootDir.getAbsolutePath() + "/local_develop.gradle")
if (localPropertiesFile.exists() && localDevelopFile.exists()) {
apply from: "local_develop.gradle"
if (ext.has("dependencies")) {ext.getProperty("dependencies").each { projectConfig ->
// 如果工程是本地依赖,应用本地工程源码进行替换
if (projectConfig["isLocalModule"]) {includeBuild(projectConfig["projectPath"]) {
dependencySubstitution {substitute module(projectConfig["projectMaven"]) with project(projectConfig["projectName"])
}
}
}
}
}
}
这样当我的项目在远端打包的时候,因为没有local_develop.gradle
,会用远端的依赖版本进行打包。我的项目在本地运行的时候,如果你增加了 local_develop.gradle,就会主动把远端依赖改本地依赖;并且因为local_develop.gradle 被 ignore
,多个开发者在应用的过程中也不会相互影响。