gradle 项目自动注册子目录模块

在开发android项目的时候,经常同一个目录下会挂载很多的子模块,而我们又需要settings.gradle里面进行配置

include(':app')

当模块特别多的时候,写起来就会很麻烦,那么简单的注册方法我用kotlin脚本写了一个,提供大家使用

脚本名称: 使用settings.gradle.kts 代替原来的settings.gradle

// 项目名称
rootProject.name = "Arto"

autoRegisterModule()

fun autoRegisterModule() {

    // 当前项目目录下的子目录
    val dirs = settingsDir.listFiles() ?: return

    // 使用这两个文件作为判断是不是子模块的依据
    val moduleFlags = arrayListOf("build.gradle", "build.gradle.kts")

    // 忽略的目录,如果有其他你暂时不需要注册的目录,也可以放进来
    val ignoreDirs = arrayListOf(
            ".gradle",
            ".idea",
            "gradle"
    )

    // 遍历子目录
    dirs.filter { file -> file.isDirectory && !ignoreDirs.contains(file.name) }
            .forEach { dir ->
                // 查找有没有文件是 build.gradle 或 build.gradle.kts 的文件 
                val isModule = (dir.listFiles() ?: return@forEach)
                        .any { file -> !file.isDirectory && moduleFlags.contains(file.name) }

                if (isModule) {
                    // 如果有,则把这个模块注册进来
                    val moduleName = dir.name
                    println("注册模块:$moduleName")
                    include(":$moduleName")
                }
            }
}



代码非常简单,如果有需要引入外部目录作为模块的,那个还是按以前的方法吧;这里一并记录下引入外部目录作为模块的两种方式,同样,使用kotlin脚本,因为也是在settings.gradle.kts中注册的

// 需要引入的外部模块名称
include(":xx")

// 方式一:相对目录
project(":xx").projectDir = File(settingsDir,"与当前目录的相对路径")

// 方式二:使用绝对路径
project(":xx").projectDir = File("模块目录的绝对路径")

补充:2021-05-31

朋友反馈说对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("模块目录的绝对路径")

打完收工!

你可能感兴趣的:(gradle 项目自动注册子目录模块)