2017-04-12 4 views
0

다음은 리소스 파일의 하위 집합을 필터링하는 gradle의 일반적인 관용구처럼 보입니다. 나는 그것이 무엇을 이해하지만 문제 구문을 해독 있습니다gradle processResources 필터 구문 이해

processResources { 
    filesMatching('foo/*.html') { 
     filter(ReplaceTokens, tokens: [key: 'value']) 
    } 
} 

내가 여기까지 이해 :

  • processResources가 복사 유형 인 자바 플러그인의 작업입니다.
  • 나는 다음과 같은 메서드를 호출하여 processResources 작업을 구성하고있다 :

    AbstractCopyTask filesMatching(String pattern, Action<? super FileCopyDetails> action)

  • 방법의 첫 번째 인수는 패턴 문자열입니다. 패턴으로 'foo/*. html'을 제공하고 있습니다.

  • 메서드의 두 번째 인수는 Action 인터페이스이며 하나의 메서드 만 있습니다. 인터페이스 구현으로 클로저를 제공하고 있습니다.

이것은 내가 잃어버린 곳입니다. 클로저 본문에서 filter 메서드를 호출합니다. 그거 어디서 났어? 암시 적 프로젝트 객체 중 하나가 아닙니다. 그리고 필터 메소드는 어떤 파일 객체에도 적용되지 않습니다. 토큰은 어떻게 대체됩니까? 그리고 ReplaceTokens은 클래스입니다. 클래스 이름을 인수로 전달하는 것이 구문 적으로 어떻게 작동합니까?

도트를 연결하지 않고 도트가 그라데이션이나 그루비 (groovy)에 있는지 확실하지 않습니다. 나는 한동안 문서와 블로그를 통해 연구했지만 행운은 아닙니다. 나는 약간의 도움에 감사드립니다. 감사.

+0

내 대답이 도움이 되었습니까? – Opal

+0

부분적으로 만 도움이 될까봐 걱정됩니다. 필자는 필터 메서드가 인수로 갖지 않고 파일 객체에서 작동하는 방식을 여전히 이해하지 못합니다. 물론 소스 코드를 읽는 것은 항상 선택 사항입니다 .. – hummingV

+0

당신이 이해하지 못하는 것은 무엇입니까? – Opal

답변

1

찾고있는 filter 방법은 인터페이스 인 정확히 here에 정의되어 있습니다. filesMatchingCopySpec에 선언되어 있으며 이후 ProcessResources ->Copy ->AbstractCopyTaskAbstractCopyTaskCopySpec을 구현합니다. 이러한 메서드는 작업 자체에서 호출됩니다.

토큰 교체는 Ant에서 제공되는 ReplaceTokens 클래스로 수행되며 groovy의 구문은 String == String.class입니다. 필터링 자체는 this 클래스에서 실행됩니다. 이 후드 아래에 무슨 일을 이해하는 가장 쉬운 방법입니다 - 내가 너희에게 권고 할 수있다 무엇

은 Gradle을 소스를 다운로드 IDE로 가져 오기 및 ProcessResourcess 클래스에서 여행을 시작하는 것입니다.

+0

Gradle CopySpec 링크가 깨졌습니다 – wspurgin

+0

It 's https://github.com/gradle/gradle/blob/master/subprojects/core-api/src/main/java/org/gradle/api/file/CopySpec.java 지금 – wspurgin