在我的Gradle脚本中,我想在源代码集中包含与特定模式匹配的目录。我需要搜索并扫描所有子目录并包含所有子目录:
api
或source
问题是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
或类似的东西?
答案 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>
,所有目录都匹配名称api
或sources
(不区分大小写),其下至少有一个groovy或java文件。
它不会检查嵌套目录,所以如果你运气不好并且有一个名为groovy/api/com/api/
的来源的目录,则会返回groovy/api
和groovy/api/com/api
。