사용자 도구

사이트 도구


gradle:customtask

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
gradle:customtask [2012/10/06 17:29]
kwon37xi [태스크 클래스 패키징]
gradle:customtask [2012/10/12 16:43] (현재)
kwon37xi [독립 프로젝트]
줄 25: 줄 25:
  
 ===== 간단한 사용자 정의 태스크 클래스 만들기 ===== ===== 간단한 사용자 정의 태스크 클래스 만들기 =====
-[[http://www.gradle.org/docs/current/dsl/org.gradle.api.DefaultTask.html|DefaultTask]]를 상속하여 구현한다.+[[http://www.gradle.org/docs/current/dsl/org.gradle.api.Task.html|Task]]의 구현체인 [[http://www.gradle.org/docs/current/dsl/org.gradle.api.DefaultTask.html|DefaultTask]]를 상속하여 구현한다.
  
 태스크에 어떤 행위를 추가하려면 [[http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskAction.html|TaskAction]] 어노테이션을 지정한 메소드를 추가하면 된다. 태스크가 실행 될 때 해당 메소드가 호출된다. 하지만 꼭 메소드를 정의할 필요는 없다. 태스크 클래스 생성자에서 ''doFirst()'' 혹은 ''doLast()''를 행위를 지정한 클로저를 인자로 줘서 호출해도 된다. 태스크에 어떤 행위를 추가하려면 [[http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskAction.html|TaskAction]] 어노테이션을 지정한 메소드를 추가하면 된다. 태스크가 실행 될 때 해당 메소드가 호출된다. 하지만 꼭 메소드를 정의할 필요는 없다. 태스크 클래스 생성자에서 ''doFirst()'' 혹은 ''doLast()''를 행위를 지정한 클로저를 인자로 줘서 호출해도 된다.
줄 36: 줄 36:
     def greet() {     def greet() {
         println 'hello from GreetingTask'         println 'hello from GreetingTask'
 +    }
 +}
 +
 +// 혹은 생성자를 이용한 다음도 가능하다.
 +class GreetingTask extends DefaultTask {
 +    GreetingTask() {
 +        doFirst {
 +            println "hello from Greeting Task constructor"
 +        }
     }     }
 } }
줄 42: 줄 51:
 > gradle -q hello > gradle -q hello
 hello from GreetingTask hello from GreetingTask
 +</code>
 +
 +태스크에 프라퍼티를 추가하여 커스터마이징을 할 수 있게 하자. 태스크는 POGO이므로 태스크 객체에 프라퍼티를 지정하거나 메소드를 호출 할 수 있다.
 +
 +  * 프라퍼티 추가된 태스크 ''build.gradle''<code groovy>
 +// 기본값사용
 +task hello(type: GreetingTask)
 +
 +// greeting 변경
 +task greeting(type: GreetingTask) {
 +    greeting = 'greetings from GreetingTask'
 +}
 +
 +class GreetingTask extends DefaultTask {
 +    def String greeting = 'hello from Greeting Task'
 +    @TaskAction
 +    def greet() {
 +        println greeting
 +    }
 +}
 +</code>
 +  * 실행하면 <code>
 +> gradle -q hello greeting
 +hello from GreetingTask
 +greetings from GreetingTask
 +</code>
 +
 +''project''로 현재 프로젝트의 인스턴스에 접근할 수 있다. ''project.rootProject''로 최상위 프로젝트에 접근할 수 있다.
 +===== 독립 프로젝트 =====
 +이제 태스크를 독립 프로젝트로 분리하여 배포하고 공유할 수 있도록 해보자. 이는 간단한 Groovy 프로젝트로 태스크 클래스를 포함하는 JAR를 생성하기만 하면 된다. Groovy 프로젝트로 만들고 Gradle API를 컴파일시 의존성에 추가한다.
 +
 +package를 ''org.gradle''로 지정해야 실제 사용시 import를 안하고 사용할 수 있다.
 +
 +  * ''build.gradle'' <code groovy>
 +apply plugin: 'groovy'
 +
 +dependencies {
 +    compile gradleApi()
 +    groovy localGroovy()
 +}
 +</code>
 +  * ''src/main/groovy/org/gradle/GreetingTask.groovy'' <code groovy>
 +package org.gradle
 +
 +// build.gradle에서는 자동으로 추가되지만 여기서는 명시적으로 import 해야한다.
 +import org.gradle.api.DefaultTask
 +import org.gradle.api.tasks.TaskAction
 +
 +class GreetingTask extends DefaultTask {
 +    String greeting = 'hello from GreetingTask'
 +
 +    @TaskAction
 +    def greet() {
 +        println greeting
 +    }
 +}
 +</code>
 +
 +==== 다른 프로젝트에서 태스크 클래스 사용하기 ====
 +태스크 클래스를 빌드 스크립트의 클래스패스에 추가해야 한다. ''buildscript { }'' 블럭을 사용하면 된다. [[gradle:organizing_build_logic|Gradle Organizing Build Logic]]에서 빌드 스크립트에 외부 의존성 추가하는 부분을 참조한다. 아래 예제는 로칼 리포지토리에 태스크 클래스를 배포한 상황을 예로 들고 있다.
 +
 +  * 다른 프로젝트에서 사용자 정의 태스크 사용하기<code groovy>
 +buildscript {
 +    // 빌드 스크립트 리포지토리에 추가하고
 +    repositories {
 +        maven {
 +            url uri('../repo')
 +        }
 +    }
 +    
 +    // classpath 구성에 의존성을 추가한다.
 +    dependencies {
 +        classpath group: 'org.gradle', name: 'customPlugin', version: '1.0-SNAPSHOT'
 +    }
 +}
 +
 +task greeting(type: org.gradle.GreetingTask) {
 +    greeting = 'howdy!'
 +}
 +</code>
 +
 +==== 태스크 클래스의 단위 테스트 작성하기 ====
 +[[http://www.gradle.org/docs/current/javadoc/org/gradle/testfixtures/ProjectBuilder.html|ProjectBuilder]] 클래스를 사용하여 [[http://www.gradle.org/docs/current/dsl/org.gradle.api.Project.html|Project]] 인스턴스를 만들어낼 수 있다. 이를 가지고 태스크 클래스를 테스트하면 된다.
 +
 +  * ''src/test/groovy/org/gradle/GreetingTaskTest.groovy'' <code groovy>
 +class GreetingTaskTest {
 +    @Test
 +    public void canAddTaskToProject() {
 +        Project project = ProjectBuilder.builder().build()
 +        def task = project.task('greeting', type: GreetingTask)
 +        assertTrue(task instanceof GreetingTask)
 +    }
 +}
 </code> </code>
gradle/customtask.1349512170.txt.gz · 마지막으로 수정됨: 2012/10/06 17:29 저자 kwon37xi