在開發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("子產品目錄的絕對路徑")
打完收工!