2016년 4월 19일 화요일

Using Ant from Gradle

Using Ant tasks and types in your build

당신의 build script 안에서, Gradle에 의해 제공되는 ant라고 불리는 property가 있다.
이 것은 AntBuilder instance의 참조이다.
Antbuilder 는 당신의 build script에서 Ant task, type, properties에 접근하는 데에 사용된다.
Ant의 build.xml 포맷에서 Groovy로 맴핑시키는 간단한 방법이 있고, 아래에 소개되어 있다.

당신은 AntBuilder instance의 method를 호출함으로써 Ant task를 실행시킬 수 있다.
당신은 method 이름을 task이름으로 사용할 수 있다.
예를 들면, 당신은 ant.echo() method를 사용함으로써 Ant echo task를 실행시킬 수 있다.
Ant task의 속성은 Map 파라미터 형태로 method로 전달된다.
아래는 echo task의 예제이다.
우리는 Groovy code와 Ant task markup을 섞어쓸 수 있다.
이 것은 극도로 강력하다.

ex) Using an Ant task

build.gradle

task hello << {
    String greeting = 'hello from Ant'
    ant.echo(message: greeting)
}

gradle hello 의 실행 결과

> gradle hello
:hello
[ant:echo] hello from Ant

BUILD SUCCESSFUL

Total time: 1 secs

당신은 task method 호출의 파라미터로 넘기는 것을 이용하여서, Ant task에 내포된 text로 넘길 수 있다.
이 예제에서, 우리는 message를 echo task에 내포된 text로써 넘길 것이다.

ex) Passing nested text to an Ant task

build.gradle

task hello << {
    ant.echo('hello from Ant')
}

gradle hello의 실행 결과

> gradle hello
:hello
[ant:echo] hello from Ant

BUILD SUCCESSFUL

Total time: 1 secs

당신은 closure 안 속으로 내포된 element 역시 Ant task로 넘겨줄 수 있다.
내포된 element는 method의 이름과 똑같이 호출하는 task와 같은 방식으로 정의된다.

ex) Passing nested elements to an Ant task

build.gradle

task zip << {
    ant.zip(destfile: 'archive.zip') {
        fileset(dir: 'src') {
            include(name: '**.xml')
            exclude(name: '**.java')
        }
    }
}

당신은 method 이름을 type의 이름으로써 사용함으로써, task에 접근하는 것과 같은 방식으로 Ant type에 접근할 수 있다.
method는 Ant data type을 return해주고, 그러고나서 당신은 이것을 build script에 직접 사용할 수 있다.
아래 예제에서, 우리는 Ant path object를 만들고, 각 content를 하나씩 보여주게 된다.

ex) Using an Ant type

build.gradle

task list << {
    def path = ant.path {
        fileset(dir: 'libs', includes: '*.jar')
    }
    path.list().each {
        println it
    }
}

Using custom Ant tasks in your build 

당신의 build에서 이용 가능한 custom task를 만들기 위해서, 당신은 taskdef 혹은 typedef Ant task를 사용할 수 있다.
그리고 나서 당신은 built-in Ant task에서 했던 것처럼 custom된 Ant task를 참조할 수 있다.

 ex) Using a custom Ant task

 build.gradle

task check << {
    ant.taskdef(resource: 'checkstyletask.properties') {
        classpath {
            fileset(dir: 'libs', includes: '*.jar')
        }
    }
    ant.checkstyle(config: 'checkstyle.xml') {
        fileset(dir: 'src')
    }
}

당신은 custom task를 위해 사용할 classpath를 모으는 데에, Gradle의 dependency management를 사용할 수 있다.
이 것을 하기위해서, 당신은 classpath를 위한 custom configuration을 정의하여야 하고, 그리고 나서 configuration에 몇몇 dependency를 추가하여야 한다.

 ex) Declaring the classpath for a custom Ant task

 build.gradle

configurations {
    pmd
}

dependencies {
    pmd group: 'pmd', name: 'pmd', version: '4.2.5'
}

classpath configuration을 사용하기 위해서, custon configuration의 asPath property를 사용하면 된다.

 ex) Using a custom Ant task and dependency management together

 build.gradle

task check << {
    ant.taskdef(name: 'pmd',
                classname: 'net.sourceforge.pmd.ant.PMDTask',
                classpath: configurations.pmd.asPath)
    ant.pmd(shortFilenames: 'true',
            failonruleviolation: 'true',
            rulesetfiles: file('pmd-rules.xml').toURI().toString()) {
        formatter(type: 'text', toConsole: 'true')
        fileset(dir: 'src')
    }
}

Importing an Ant build

 당신은 Ant build를 Gradle project로 import하기 위해 ant.importBuild() method를 사용할 수 있다.
당신이 Ant build를 import할 때, 각각의 Ant target은 Gradle task로써 다루어진다.
이 것은 당신이 Ant target을 Gradle task와 같이 조정하고 실행할 수 있다는 것을 의미한다.

 ex) Importing an Ant build

 build.gradle

ant.importBuild 'build.xml'

build.xml


    
        Hello, from Ant
    


gradle hello 의 결과

> gradle hello
:hello
[ant:echo] Hello, from Ant

BUILD SUCCESSFUL

Total time: 1 secs

당신은 Ant target에 의존적인 task 역시 실행할 수 있다.

 ex) Task that depends on Ant target

build.gradle


ant.importBuild 'build.xml'

task intro(dependsOn: hello) << {
    println 'Hello, from Gradle'
}

gradle intro 의 실행 결과

> gradle intro
:hello
[ant:echo] Hello, from Ant
:intro
Hello, from Gradle

BUILD SUCCESSFUL

Total time: 1 secs

또는, Ant target에 어떠한 행위를 추가할 수도 있다.

 ex) Adding behaviour to an Ant target

 build.gradle

ant.importBuild 'build.xml'

hello << {
    println 'Hello, from Gradle'
}

gradle hello 의 실행 결과

> gradle hello
:hello
[ant:echo] Hello, from Ant
Hello, from Gradle

BUILD SUCCESSFUL

Total time: 1 secs

Ant target이 Gradle task에 의존적이게 설정하는 것도 가능하다.

 ex) Ant target that depends on Gradle task

 build.gradle

ant.importBuild 'build.xml'

task intro << {
    println 'Hello, from Gradle'
}

build.xml


    
        Hello, from Ant
    


gradle hello 의 실행 결과

> gradle hello
:intro
Hello, from Gradle
:hello
[ant:echo] Hello, from Ant

BUILD SUCCESSFUL

Total time: 1 secs

가끔 현재 존재하는 Gradle task와의 충돌을 피하기 위해 Ant target으로부터 생성된 task를 다시 이름붙이는 것이 필요한 경우가 있다.
이 것을 하기위해, AntBuilder.importBuild() method를 사용할 수 있다.

Renaming imported Ant targets

build.gradle

ant.importBuild('build.xml') { antTargetName ->
    'a-' + antTargetName
}

build.xml


    
        Hello, from Ant
    


gradle a-hello 의 실행 결과

> gradle a-hello
:a-hello
[ant:echo] Hello, from Ant

BUILD SUCCESSFUL

Total time: 1 secs


Ant properties and references

Ant task에 사용될 수 있는 Ant property를 설정할 수 있는 방법은 다양하다.
당신은 AntBuilder instance에서 property를 직접적으로 설정할 수 있다.
Ant Property는 당신이 변환할 수 있는 Map 형태로도 사용 가능하다.
당신은 또한 Ant property task 도 사용할 수 있다. 아래 예제들을 보자.

 ex) Setting an Ant property

 build.gradle

ant.buildDir = buildDir
ant.properties.buildDir = buildDir
ant.properties['buildDir'] = buildDir
ant.property(name: 'buildDir', location: buildDir)

build.xml

buildDir = ${buildDir}

많은 Ant tasks는 그것들이 실행될 때 property를 설정한다.
그것들의 property를 가져올 수 있는 다양한 방법이 존재한다.
당신은 AntBuilder instance로부터 직접적으로 property를 가져올 수 있다.
이 Ant properties 역시 Map 형태로 이용가능하다.
아래 예제를 보자.

 ex) Getting an Ant property

 build.xml


build.gradle

println ant.antProp
println ant.properties.antProp
println ant.properties['antProp']

Ant reference를 설정하기 위한 몇가지 방법도 있다.

 ex) Setting an Ant reference

 build.gradle

ant.path(id: 'classpath', location: 'libs')
ant.references.classpath = ant.path(location: 'libs')
ant.references['classpath'] = ant.path(location: 'libs')

build.xml


Ant reference를 가져오는 몇 가지 방법 역시 존재한다. 

ex) Getting an Ant reference

 build.xml


build.gradle

println ant.references.antPath
println ant.references['antPath']


API
Ant integration은 AntBuilder에 의해 제공된다.

원본 출처 : https://docs.gradle.org/current/userguide/ant.html

댓글 없음 :

댓글 쓰기