2013-04-26 2 views
4

첫 번째 Gradle 플러그인을 만들려고합니다.
1. 속성의 확장자를 추가하십시오. project.extensions.create("abc", AbcExtension)
2. 복사 작업을 정의하십시오. 나는이 방법으로 다음과 같은 작업을 정의 할 때Gradle 플러그인에서 작업을 정의하는 올바른 방법은 무엇입니까?

project.task("abcTask", type: Copy) { 
    from project.abc.fromPath 
    into project.abc.intoPath 
} 

project.abc.fromPath는 AbcExtension.fromPath 값과 동일 - 그것은 build.gradle에서 값을 읽지 않습니다.
나는 작업을 다음과 같은 방법으로

project.task("abcTask", type: Copy) << { 
    from project.abc.fromPath 
    into project.abc.intoPath 
} 

항상 UP-TO-DATE를 인쇄 작업을 실행하지 않습니다를 정의 할 때. 이 동작을 설명하고

+0

이 질문은 - http://stackoverflow.com/questions/15632696/gradle-tasks-difference도 많이 도움이되었습니다. –

답변

11

플러그인이 될 수 변경 가능한 빌드 모델 값의 읽을 때마다 (즉, 아무것도 연기해야 ​​(typedependsOn functionallity을 포함) Gradle을 플러그인에서 작업을 정의하는 올바른 방법이 무엇인지 말해

Pls는 빌드 스크립트에서 설정) 적어도 구성 단계의 끝까지. 이 목표를 달성하는 데는 여러 가지 방법이 있습니다. 그 중입니다 :

  • 는 값으로 클로저를 받아들이는 Gradle을 API를 사용하여 (예를 들어 Copy.from) 컨벤션 매핑 메커니즘 (이 공공 기능으로 간주되지 않습니다주의를 사용 project.afterEvaluate {} 또는 gradle.projectsEvaluated {}
  • 같은
  • 사용하여 콜백)

작업을위한 최상의 옵션을 선택하려면 전문 지식이 필요합니다. (그것은 Gradle codebase에서 플러그인의 일부를 연구하는 데 도움이 될 수 있습니다.) 귀하의 경우에는, 나는 다음을 수행 할 수 있습니다 너무 늦게 Copy 작업을 구성하기 때문에

project.task("abcTask", type: Copy) { 
    from { project.abc.fromPath } 
    into { project.abc.intoPath } 
} 

귀하의 << 버전은 작동하지 않습니다. 일반적으로 모든 구성은 실행 단계가 아니라 구성 단계에서 이루어져야합니다. Gradle User Guide에서 Gradle 빌드 단계에 대해 자세히 알아볼 수 있습니다.

관련 문제