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.gradlesettings.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("模块目录的绝对路径")

打完收工!

上一篇:交换网络内的流量异常转发问题


下一篇:内存数据库