Gradle中列出与特定模式匹配的子目录的最常用方法

Gradle中列出与特定模式匹配的子目录的最常用方法,gradle,groovy,build.gradle,Gradle,Groovy,Build.gradle,在我的Gradle脚本中,我希望在源代码集中包含与特定模式匹配的目录。我需要搜索和扫描所有子目录,并包括所有子目录: 任何包含Java或Groovy文件的二级目录(可以深入嵌套在包文件夹结构中) 和/或具有特定名称的任何子/目录,例如api或source 问题是javasourceset下的srcDirs只接受目录而不接受文件 到目前为止,我所尝试的: def javaSourceDirs = [] project.rootDir.eachFileRecurse(FileType.DIRECTO

在我的Gradle脚本中,我希望在源代码集中包含与特定模式匹配的目录。我需要搜索和扫描所有子目录,并包括所有子目录:

  • 任何包含Java或Groovy文件的二级目录(可以深入嵌套在包文件夹结构中)
  • 和/或具有特定名称的任何子/目录,例如
    api
    source
  • 问题是
    javasourceset
    下的
    srcDirs
    只接受目录而不接受文件

    到目前为止,我所尝试的:

    def javaSourceDirs = []
    project.rootDir.eachFileRecurse(FileType.DIRECTORIES) { file ->
        if ((file.getName().equalsIgnoreCase("api") || file.getName().equalsIgnoreCase("sources")))
            javaSourceDirs << file
    }
    sourceSets {
        main {
            java {
                srcDirs = javaSourceDirs
            };
        }
    }
    
    def javaSourceDirs=[]
    project.rootDir.eachFileRecurse(FileType.DIRECTORIES){file->
    if((file.getName().equalsIgnoreCase(“api”)| | file.getName().equalsIgnoreCase(“源”))
    javaSourceDirs这应该可以:

    def findAllUnder = { File f, String fileOrDir, String pattern ->
        def result = [ ]
        def recursiveCall
        switch ( fileOrDir ) {
            case 'file': recursiveCall = f.&eachFileRecurse
                break
            case 'dir': recursiveCall = f.&eachDirRecurse
                break
            default: throw new RuntimeException( "Must be file or dir: $fileOrDir" )
        }
    
        recursiveCall { File path -> if ( path.name ==~ pattern ) result << path }
    
        return result
    }
    
    def hasSources = { File f -> f.directory && findAllUnder( f, 'file', /.*\.(groovy|java)/ ) }
    
    def sourceDirs = findAllUnder( project.rootDir, 'dir', '(?i)api|sources' ).findAll( hasSources )
    
    def findAllUnder={File f,String filer,String pattern->
    def结果=[]
    def递归调用
    交换机(文件管理器){
    案例“文件”:recursiveCall=f.&eachFileRecurse
    打破
    案例“dir”:recursiveCall=f.&eachdir
    打破
    默认值:抛出新的运行时异常(“必须是file或dir:$fileorder”)
    }
    递归调用{File path->if(path.name==~pattern)结果f.directory&&findAllUnder(f,'File',/.\(groovy | java)/)}
    def sourceDirs=findAllUnder(project.rootDir,'dir','(?i)api | sources').findAll(hasSources)
    
    它将返回一个
    列表
    ,其中所有dir都与名称
    api
    (不区分大小写)相匹配,这些名称下至少有一个groovy或java文件

    它不会检查嵌套的dir,因此,如果您运气不好,并且有一个dir的源代码名为
    groovy/api/com/api/
    ,那么
    groovy/api
    groovy/api/com/api
    都将返回。

    这应该可以:

    def findAllUnder = { File f, String fileOrDir, String pattern ->
        def result = [ ]
        def recursiveCall
        switch ( fileOrDir ) {
            case 'file': recursiveCall = f.&eachFileRecurse
                break
            case 'dir': recursiveCall = f.&eachDirRecurse
                break
            default: throw new RuntimeException( "Must be file or dir: $fileOrDir" )
        }
    
        recursiveCall { File path -> if ( path.name ==~ pattern ) result << path }
    
        return result
    }
    
    def hasSources = { File f -> f.directory && findAllUnder( f, 'file', /.*\.(groovy|java)/ ) }
    
    def sourceDirs = findAllUnder( project.rootDir, 'dir', '(?i)api|sources' ).findAll( hasSources )
    
    def findAllUnder={File f,String filer,String pattern->
    def结果=[]
    def递归调用
    交换机(文件管理器){
    案例“文件”:recursiveCall=f.&eachFileRecurse
    打破
    案例“dir”:recursiveCall=f.&eachdir
    打破
    默认值:抛出新的运行时异常(“必须是file或dir:$fileorder”)
    }
    递归调用{File path->if(path.name==~pattern)结果f.directory&&findAllUnder(f,'File',/.\(groovy | java)/)}
    def sourceDirs=findAllUnder(project.rootDir,'dir','(?i)api | sources').findAll(hasSources)
    
    它将返回一个
    列表
    ,其中所有dir都与名称
    api
    (不区分大小写)相匹配,这些名称下至少有一个groovy或java文件

    它不会检查嵌套的dir,因此如果您运气不好,并且有一个dir的源代码名为
    groovy/api/com/api/
    ,那么
    groovy/api
    groovy/api/com/api
    都将返回