2016-09-06 2 views
1

내 Gradle 스크립트에서 특정 패턴과 일치하는 디렉토리를 원본 세트에 포함시키고 싶습니다. 나는 모든 하위 디렉토리를 검색하고 모든 하위 디렉토리를 검색하고 포함해야합니다 : Java 또는 그 (것)들에있는 그루비 파일 (깊이 패키지 폴더 구조 안에 중첩 될 수있다)가특정 패턴과 일치하는 하위 디렉토리를 나열하는 Gradle의 가장 멋진 방법

  1. 모든 두 번째 수준의 디렉토리.
  2. 및/또는 특정 이름을 가진 하위/디렉토리. api 또는 source

문제는 srcDirsjava 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

이 작동합니다 :

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) 

그것은 모든 DIRS가 일치하는 이름을 가진 List<File>를 반환합니다 api 또는 sources (대소 문자 구분) 그 아래에 적어도 하나 개의 그루비 또는 자바 파일이 있습니다.

중첩 된 디렉토리를 확인하지 않으므로 불운 한 소스 groovy/api/com/api/이있는 디렉토리가있는 경우 groovy/apigroovy/api/com/api이 모두 반환됩니다.

관련 문제