【问题标题】:Grooviest way in Gradle to list subdirectories matching a certain patternGradle 中列出与特定模式匹配的子目录的最常用方法
【发布时间】:2017-01-14 06:32:25
【问题描述】:

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

  1. 任何包含 Java 或 Groovy 文件的二级目录(可能深深嵌套在包文件夹结构中)。
  2. 和/或任何具有特定名称的子/目录,例如apisource

问题是java sourceSet下的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
        };
    }
}

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

【问题讨论】:

    标签: gradle groovy build.gradle


    【解决方案1】:

    这应该可行:

    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&lt;File&gt;,其中所有目录都与名称apisources(不区分大小写)匹配,其中至少有一个groovy 或java 文件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2011-01-07
      • 2015-09-02
      相关资源
      最近更新 更多