天天看點

gradle 項目自動注冊子目錄子產品

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

打完收工!