美文网首页
gradle 项目自动注册子目录模块

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

作者: Artfox丶艺狸 | 来源:发表于2021-05-30 20:55 被阅读0次

    在开发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 项目自动注册子目录模块

          本文链接:https://www.haomeiwen.com/subject/txumsltx.html