在开发android项目的时候,经常同一个目录下会挂载很多的子模块,而我们又需要settings.gradle
里面进行配置
include(':app')
当模块特别多的时候,写起来就会很麻烦,那么简单的注册方法我用kotlin脚本写了一个,提供大家使用
脚本名称: 使用settings.gradle.kts
代替原来的settings.gradle
// 项目名称
rootProject.name = "Arto"
autoRegisterModule()
// 主动排除 src 目录
// autoRegisterModule(ignoreSubDirs = arrayOf("src"))
/**
* 自动注册当前所有子目录下的模块
* @param dir 项目目录
* @param ignoreSubDirs 忽略的子目录
*/
fun autoRegisterModule(
dir: File = settingsDir,
ignoreSubDirs: Array<String> = emptyArray()
) {
val moduleSymbol = arrayOf("build.gradle", "build.gradle.kts")
// 忽略的目录,如果有不想自动注册的目录也可以放进来
val ignoreDirs = arrayOf(".gradle", ".idea", ".git", "gradle", "build") + ignoreSubDirs
dir.listFiles()?.forEach { f ->
if (!f.isDirectory || ignoreDirs.contains(f.name)) return@forEach
// 遍历子目录
(f.listFiles() ?: return@forEach)
// 判断此目录下有没有符合条件的文件
.takeIf { fs -> fs.any { !it.isDirectory && moduleSymbol.contains(it.name) } }
?.let {
val moduleName = f.name
include(":$moduleName")
println("注册模块:$moduleName")
}
}
}
代码非常简单,如果有需要引入外部目录作为模块的,那个还是按以前的方法吧;这里一并记录下引入外部目录作为模块的两种方式,同样,使用kotlin脚本,因为也是在settings.gradle.kts
中注册的
// 需要引入的外部模块名称
include(":xx")
// 方式一:相对目录
project(":xx").projectDir = File(settingsDir,"与当前目录的相对路径")
// 方式二:使用绝对路径
project(":xx").projectDir = File("模块目录的绝对路径")
补充:
朋友反馈说对kotlin不熟悉,希望提供个groovy版本的,下面放出groovy版本
注:settings.gradle
与 settings.gradle.kts
保留一个即可
settings.gradle
rootProject.name = "Arto"
autoRegisterModule()
// 自动注册当前所有子目录下的模块
def autoRegisterModule() {
def moduleSymbol = ["build.gradle", "build.gradle.kts"]
// 忽略的目录,如果有不想自动注册的目录也可以放进来
def ignoreDirs = [
".gradle",
".idea",
".git",
"build"
]
settingsDir.eachDir { file ->
if (ignoreDirs.contains(file.getName())) return
file.eachFile { f ->
if (!f.isDirectory() && moduleSymbol.contains(f.getName())) {
def modelName = file.getName()
// 是模块,可以注册
println "注册模块:$modelName"
include(":$modelName")
}
}
}
}
同样外部模块引用代码
// 方式一:相对目录
project(":xx").projectDir = new File(settingsDir,"与当前目录的相对路径")
// 方式二:使用绝对路径
project(":xx").projectDir = new File("模块目录的绝对路径")
打完收工!