1. 그래들 소개
그래들은 앤트의 유연함과 메이븐 규약의 특성을 지닌, 의존성 관리가 되는 자동화 빌드 도구로 그래들을 소개하고 있습니다. 앤트는 Task 중심의 빌드 도구로, Task를 자바로 작성하고 이를 확장해 XML에서도 사용할 수 있어 Task 확장성을 통한 유연함을 제공합니다. 그래들도 앤트처럼 Task 개념이 있고 메이븐처럼 플러그인을 이용해 새로운 작업을 수행할 수 있습니다. 간단히 표현하면, 그래들은 차세대 빌드 도구로 메이븐과 앤트의 장점을 더한 도구입니다.
그래들은 유연함을 극대화하기 위해 XML이 아닌 그루비로 작성되었습니다. 기존에는 같은 내용을 XML로 반복하여 작성했지만, 그래들은 반복문을 통해 좀 더 간결하게 작성할 수 있습니다. 그런데 그래들을 사용하기 위해 그루비를 능숙하게 다룰 필요는 없습니다. 그래들은 빌드 스크립트 언어(Build Script Language)이자 DSL(Domain Specific Language)이기 때문입니다.
2. 그래들 기본
사용자 정의 Task 만들기
다음 코드를 build.gradle 파일에 추가하여 'Gradle Hello'를 출력해 봅시다.
task hello {
println 'Gradle Hello'
}
그래들에서는 Task를 만들 때는 'task Task명'을 입력합니다. 스크립트를 사용할 때 'function 함수명'을 입력하는 것과 같은 방식입니다. Task를 만들면 Task 목록에 등록되어 gradle tasks 명령으로 확인할 수 있습니다. 사용자가 정의한 Task는 'Other' tasks에 표시됩니다.
Task 실행은 다음과 같이 입력하면 됩니다.
gradle hello
Task 실행 순서 제어하기
그래들에서 Task에 대한 실행 순서를 정의할 수 있습니다. 실행 순서를 제어하는 가장 간단한 방법은 '<<' (Left Shift) 연산자를 사용하는 것입니다.
일반적으로 C언어에서는 비트 연산자로 사용하지만, 그래들에서는 구문을 삽입한다는 의미의 클로저로 사용합니다. 클로저: 함수를 선언할 때 만들어지는 유효범위로, 함수는 이를 통해 유효 범위에 속하는 변수와 함수를 사용할 수 있다.
task run << {
println 'running now'
}
task start {
println 'ready'
}
Task를 실행하면
$ gradle run start
ready
:run
running now
run Task에 추가한 레프트 시프트 연산자 때문에 run Task가 가장 마지막에 실행됩니다. 이는 run Task가 빌드의 맨 마지막 단계까지 유효범위가 유지되기 때문입니다.
그러나,
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
Task.leftShift 메소드는 Gradle 5.0에서 deprecated 될 것 같다.
First와 Last를 이용하여 연관성 있는 Task들을 좀더 구조적으로 순서를 표현할 수 있습니다.
task cellphone {
description = 'Display calling message'
doLast {
println '통화하기'
}
doFirst {
println '전화걸기'
}
doLast {
println '전화끊기'
}
}
'통화하기'가 가장 상단에 있지만, '전화걸기' 출력이 First 였기 때문에 '전화걸기'가 먼저 출력되고 두 개의 Last 중에서는 상단에 있는 '통화하기'가 먼저 출력됩니다.
$ gradle cellphone
:cellphone
전화걸기
통화하기
전화끊기
디폴트 Task 지정하기
그래들에서는 기본으로 실행해야 하는 Task를 디폴트로 지정할 수 있습니다. 그래들을 실행할 때 'cellphone'과 같은 Task의 이름을 파라미터로 지정하였지만 Task를 디폴트로 지정하면 'gradle'만 입력해도 실행할 수 있습니다.
task myBasicTask << {
println 'default task'
}
task other << {
println 'other run'
}
디폴트 Task 실행
$ gradle
:myBasicTask
default task
Task에 설명 추가하기
메서드의 주석처럼 Task에 설명을 추가하여 정보를 표시할 수 있습니다.
task myBasicTask(description:'디폴트 Task입니다.') << {
println 'default task'
}
'Description:내용' 형태로 입력하면 Task 목록이 출력될 때 표시됩니다.
다른 Task와 연관 지어 실행하기
디폴트로 지정한 Task가 실행될 때 다른 Task도 함께 실행하려면 'dependsOn'으로 의존관계를 설정하면 됩니다.
다음과 같이 tasks로 전체 Task를 참조하고 닷(.) 연산자로 의존관계를 설정하면 other Task 실행 후 myBasicTask가 실행됩니다.
tasks.myBasicTask.dependOn other
실행 결과
$ gradle
:other
other run
:myBasicTask
default task
또는 다음과 같이 간단히 dependsOn 구문만으로 직접 표현할 수도 있습니다.
task myBasicTask(description:'디폴트 Task입니다.', dependsOn:other) << {
println 'default task'
}
로깅 설정하기
Task를 콘솔에서 실행하면 Task의 실행 결과 외에도 포함된 내용들이 모두 출력됩니다. 그래들에서는 사용자가 직접 Task에 로그 레벨을 정의하면 로그 레벨에 따라 결과를 다르게 볼 수 있습니다.
task myBasicTask(description:'디폴트 Task입니다.', dependsOn:other) << {
logging.level = LogLevel.DEBUG
println 'default task'
}
Task 그룹화하기
Task들을 그룹으로 분류하여 좀 더 명확하게 관리할 수 있습니다.
def myGroup = 'first'
task mymemtask1(group:myGroup) << {
println 'my mem1'
}
task mymemtask2(group:myGroup) << {
println 'my mem2'
}
이제 tasks로 Task 목록을 출력하면 other가 아니라 지정한 그룹명 아래에 표시됩니다.
이 글은 [엔터프라이즈 빌드 자동화를 위한 Gradle]를 스터디하면서 정리한 내용입니다.