Chapter 59. Gradle Wrapper

http://changyeopkim.blogspot.kr/2013/04/gradle-wrapper.html


Gradle Wrapper(이하 wrapper)는 Gradle 빌드를 시작하는데 가장 선호되는 방법입니다. wrapper는 윈도우의 배치 스크립트이고, 다른 운영체제의 쉘 스크립트입니다. wrapper를 통해서 Gradle 빌드를 시작할 때, Gradle이 자동으로 다운로드되고 빌드를 동작하는데 사용됩니다.

wrapper는 당신이 반드시 버전 관리 시스템에서 사용해야하는 것입니다. 프로젝트에 wrapper를 함께 배포함으로써, 누구든지 Gradle을 설치할 필요없이 프로젝트를 이용할 수 있습니다. 더 좋은 것은, 빌드를 하는 유저들은 빌드가 이루어진 동일한 버전의 Gradle의 사용을 보장받습니다. 물론, 이는 서버에 아무 설정도 필요치 않기 때문에 지속적인 통합(continuous integration)을 하는 서버(주기적으로 프로젝트를 빌드하는 서버)에도 유용합니다.

wrapper는 프로젝트에 Wrapper 태스크를 설정한 빌드 스크립트를 추가하고 실행하는 것으로 설치할 수 있습니다.


Example 59.1. Wrapper 태스크
build.gradle
task wrapper(type: Wrapper) {
    gradleVersion = '0.9'
}
콘솔창에서 gradle wrapper를 실행해보면, 프로젝트 디렉토리에 새로운 혹은 업데이트 된 파일을 확인할 수 있을 것입니다(wrapper 태스크의 기본 설정이 사용되었을 경우). 

Example 59.2. Wrapper 생성 파일
Build layout
simple/
  gradlew
  gradlew.bat
  gradle/wrapper/
    gradle-wrapper.jar
    gradle-wrapper.properties

위의 모든 파일들은 반드시 버전 관리 시스템에 들어가야합니다. 딱 한번만 하면 됩니다. 이 파일들이 프로젝트에 추가되면, 프로젝트는 gradlew 명령어로 빌드됩니다. gradlew 명령어는 gradle 명령어와 완전히 동일하게 사용합니다.

만약 새로운 버전의 Gradle을 사용하고 싶다면, wrapper 태스크를 재실행할 필요는 없습니다.  gradle-wrapper.properties 파일의 항목을 수정하는 것으로 충분합니다. 그러나 gradle-wrapper의 기능이 향상시키려면, wrapper 파일들을 재생성해야합니다.

59.1. 설정

gradlew로 Gradle을 실행시키면, Gradle은 Gradle 프로젝트의 wrapper가 유효한지를 검사합니다. 유효하지않다면 다운로드를 시도하고, 다운로드 되지 않으면 gradle 명령어로 입력된 모든 파라미터를 전달하여 실행하게 됩니다.

wrapper 파일이 어디에 저장되어야하는지도 명시할 수 있습니다(프로젝트 디렉토리내에).

Example 59.3. wrapper 태스크 설정
build.gradle
task wrapper(type: Wrapper) {
    gradleVersion = '0.9'
    jarFile = 'wrapper/wrapper.jar'
}
Build layout
customized/
  gradlew
  gradlew.bat
  wrapper/
    wrapper.jar
    wrapper.properties

wrapper 배포 URL을 명시할 수 있습니다. 또한, wrapper 배포가 어디에 저장되고 어디에 묶음이 풀려야하는지를 명시할 수 있습니다(프로젝트 내부나 Gradle의 홈 디렉토리). wrapper가 실행되고 wrapper 배포의 로컬 보관이 있다면, Gradle은 그것을 다운로드하고 명시된 장소에 저장할 것입니다. 풀린 wrapper 배포가 없다면, Gradle은 로컬 보관을 명시된 장소에 묶음 해제할 것입니다. 모든 설정 옵션은 wrapper 배포의 버전을 제외하고 기본입니다.

wrapper를 설정하는 법에 대해 더 알고 싶으시면 Wrapper를 참조하세요.

gradlew로 빌드할 때 아무것도 다운로드하고 싶지 않다면, 그냥 Gradle 배포 zip을 wrapper 설정에 명시된 장소에 넣고 버전 관리 시스템에 추가하세요. 상대 주소가 지원됩니다 - gradle-wrapper.properties 파일의 상대 경로로 배포 파일을 명시해야합니다.

wrapper로 빌드하면, 컴퓨터의 존재하는 모든 Gradle은 무시됩니다.

59.2. 유닉스 파일 권한

Wrapper 태스크는 gradlew *NIX 명령어를 실행하기 위해 적절한 파일 권한을 부여합니다. Subversion은 이러한 파일 권한을 보존해줍니다. 다른 버전 관리 시스템이 이 문제를 어떻게 처리하고 있는지는 잘 모르겠습니다. 항상 해야할 것은 sh gradlew로 실행하는 것입니다.

59.3. 환경 변수

Gradle Wrapper를 사용하다보면 이상한 현상들이 있습니다. 예를 들어, 지속적인 통합(continuous integration) 서버가 Gradle 배포를 압축해제하다가 죽었다고 합시다. 이때 gradlew가 배포 디렉토리에 있지만, 배포는 오염되었습니다.  혹은, zip 배포가 제대로 다운로드되지 않습니다. 지속적인 통합 서버에 오염된 파일을 삭제하기 위한 관리자 권한이 없을 때를 위하여, Gradle은 환경 변수를 통해 해결책을 제시합니다.

Table 59.1. Gradle wrapper 환경 변수
변수 이름의미
GRADLE_WRAPPER_ALWAYS_UNPACKtrue로 설정되면, gradlew가 실행되고 배포 zip이 제대로 해제되었을 때, 배포 디렉토리는 항상 삭제됩니다. zip이 없다면, Gradle은 다운로드를 시도합니다.
GRADLE_WRAPPER_ALWAYS_DOWNLOADtrue로 설정되면, gradlew가 실행되고 배포 zip이 제대로 다운로드되었을 때, 배포 디렉토리와 배포 zip은 항상 삭제됩니다. zip이 없다면, Gradle은 다운로드를 시도합니다.