Gradle中以Grooviest方式列出与特定模式匹配的子目录

时间:2016-09-06 17:56:37

标签: gradle groovy build.gradle

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

  1. 其中包含Java或Groovy文件的任何二级目录(可以深深嵌套在包文件夹结构中)。
  2. 和/或具有特定名称的任何子/目录,例如apisource
  3. 问题是srcDirs下的java sourceSet只接受目录而不接受文件。

    到目前为止我尝试过:

    def javaSourceDirs = []
    project.rootDir.eachFileRecurse(FileType.DIRECTORIES) { file ->
        if ((file.getName().equalsIgnoreCase("api") || file.getName().equalsIgnoreCase("sources")))
            javaSourceDirs << file
    }
    sourceSets {
        main {
            java {
                srcDirs = javaSourceDirs
            };
        }
    }
    

    只是想知道是否有更好/更清洁的方式使用fileTree或类似的东西?

1 个答案:

答案 0 :(得分:0)

这应该有效:

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 )

它将返回List<File>,所有目录都匹配名称apisources(不区分大小写),其下至少有一个groovy或java文件。

它不会检查嵌套目录,所以如果你运气不好并且有一个名为groovy/api/com/api/的来源的目录,则会返回groovy/apigroovy/api/com/api