문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
gradle:buildlifecycle [2012/10/02 19:48] kwon37xi |
gradle:buildlifecycle [2014/08/29 14:40] kwon37xi [프로젝트 평가] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Gradle Build Lifecycle ====== | ====== Gradle Build Lifecycle ====== | ||
* [[http:// | * [[http:// | ||
- | TBD | + | |
+ | Gradle은 의존성 기반의 프로그래밍용 언어이다. 이 말은 태스크를 정의하고 또한 태스크들 사이의 의존성도 정의 할 수 있다는 뜻이다. | ||
+ | |||
+ | **Gradle은 태스크들이 의존성의 순서에 따라 실행되고, | ||
+ | |||
+ | Gradle은 태스크를 실행하기 전에 완전한 의존성 그래프를 구축한다. | ||
+ | |||
+ | ===== 빌드 단계 ===== | ||
+ | Gradle 빌드는 3 단계로 구분된다. | ||
+ | |||
+ | * 초기화 : 단일/ | ||
+ | * 구성 : 빌드에 속하는 모든 프로젝트의 빌드 스크립트를 실행한다. 이를 통해 프로젝트 객체를 구성한다. | ||
+ | * 실행 : 구성 단계에서 생성하고 설정된 태스크 중에 실행할 것을 결정한다. 이 때 '' | ||
+ | |||
+ | ===== 설정 파일 ===== | ||
+ | 빌드 파일 말고도 설정 파일도 있다. 설정 파일은 명명규칙에 따라 Gradle이 자동 인식한다. 기본 파일명은 '' | ||
+ | |||
+ | 설정 파일은 초기화 단계에서 실행된다. 멀티 프로젝트는 무조건 최상위 프로젝트에 '' | ||
+ | |||
+ | * 단일 프로젝트에서의 '' | ||
+ | println 'This is executed during the initialization phase.' | ||
+ | </ | ||
+ | * '' | ||
+ | println 'This is executed during the configuration phase.' | ||
+ | |||
+ | task configured { | ||
+ | println 'This is also executed during the configuration phase.' | ||
+ | } | ||
+ | |||
+ | task test << { | ||
+ | println 'This is executed during the execution phase.' | ||
+ | } | ||
+ | </ | ||
+ | * 실행하면 < | ||
+ | > gradle test | ||
+ | This is executed during the initialization phase. | ||
+ | This is executed during the configuration phase. | ||
+ | This is also executed during the configuration phase. | ||
+ | :test | ||
+ | This is executed during the execution phase. | ||
+ | |||
+ | BUILD SUCCESSFUL | ||
+ | </ | ||
+ | |||
+ | 빌드 스크립트에서는 프라퍼티 접근과 메소드 호출이 project 객체로 위임 된다. 유사하게 설정 파일에서는 [[http:// | ||
+ | |||
+ | ===== 멀티 프로젝트 빌드 ===== | ||
+ | 멀티 프로젝트 빌드는 Gradle을 한 번실행하는 동안 하나 이상의 프로젝트를 빌드한다. 설정 파일에 소속 프로젝트를 지정해준다. [[gradle: | ||
+ | |||
+ | ==== 프로젝트 위치 ==== | ||
+ | 멀티 프로젝트는 항상 단일 최상위 아래에 트리 구조로 표현된다. 트리의 각 요소는 프로젝트를 나타낸다. 프로젝트는 경로로 표현된다. 보통 경로는 프로젝트의 파일 시스템에서의 물리적 위치로 구성된다. 하지만 이것도 설정 가능하다. 프로젝트 트리는 '' | ||
+ | |||
+ | ==== 트리구조 구축 ==== | ||
+ | === 계층적 레이아웃=== | ||
+ | * '' | ||
+ | include ' | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | === 단층(flat) 레이아웃 === | ||
+ | * '' | ||
+ | includeFlat ' | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | === 프로젝트 트리의 요소 수정 === | ||
+ | 설정 파일에서 만들어진 멀티 프로젝트 트리는 프로젝트 기술자(project descriptors)라는 것으로 만들어진다. 이 기술자를 변경할 수 있다. | ||
+ | |||
+ | * 프로젝트 트리의 요소 수정 전 '' | ||
+ | println rootProject.name | ||
+ | println project(': | ||
+ | </ | ||
+ | * 수정해보자 '' | ||
+ | rootProject.name = ' | ||
+ | project(': | ||
+ | project(': | ||
+ | </ | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | ===== 초기화 ===== | ||
+ | Gradle이 단일 혹은 멀티 프로젝트 빌드를 실행할지 판단하는 기준이 있다. 설정 파일이 있는 디렉토리에서 멀티 프로젝트를 빌드를 실행하면 판단이 쉽다. 하지만 서브 프로젝트 아무데서나 빌드를 실행할 수도 있다. '' | ||
+ | |||
+ | * 현재 디렉토리와 동일한 계층 단계의 '' | ||
+ | * 없으면, 부모 디렉토리에서 '' | ||
+ | * 없으면, 단일 프로젝트로 빌드를 실행한다. | ||
+ | * '' | ||
+ | |||
+ | 이런 식으로 작동하는 이유는 멀티 프로젝트 일 경우 모든 멀티프로젝트 빌드 구성을 생성해야하기 때문이다. '' | ||
+ | |||
+ | 설정 파일 자동 탐색은 물리적으로 계층/ | ||
+ | |||
+ | Gradle은 빌드에 참여하는 모든 프로젝트에 대해 Project 객체를 생성한다. 각 프로젝트는 기본적으로 탑레벨 디렉토리를 '' | ||
+ | |||
+ | |||
+ | ===== 빌드 스크립트 라이프사이클에 반응하기 ===== | ||
+ | 라이프싸이클을 진행하는 동안 빌드 스크립트에서 알림을 받을 수 있다. 알림은 특별한 리스너 인터페이스를 구현하거나 혹은 알림이 발생했을 때 실행할 클로저를 제공해 주는 두가지 방식으로 구현한다. | ||
+ | |||
+ | ==== 프로젝트 평가 ==== | ||
+ | 프로젝트를 평가하기 직전과 직후에 알림을 받을 수 있다. 빌드 스크립트에서 모든 정의가 적용된 이후에 추가적인 구성을 수행할 때나 로깅 혹은 프로파일링을 하고자 할 때 사용한다. | ||
+ | |||
+ | * '' | ||
+ | allprojects { | ||
+ | afterEvaluate { project -> | ||
+ | if (project.hasTests) { | ||
+ | println " | ||
+ | project.task(' | ||
+ | println " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * '' | ||
+ | hasTests = true | ||
+ | </ | ||
+ | * 실행하면 < | ||
+ | > gradle -q test | ||
+ | Adding test task to project ': | ||
+ | Running tests for project ': | ||
+ | </ | ||
+ | [[http:// | ||
+ | |||
+ | 아무 프로젝트든 평가한 뒤에 알림을 받는 것도 가능하다. '' | ||
+ | |||
+ | * 프로젝트의 성공 여부를 보여주는 '' | ||
+ | gradle.afterProject {project, projectState -> | ||
+ | if (projectState.failure) { | ||
+ | println " | ||
+ | } else { | ||
+ | println " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * 실행하면 < | ||
+ | > gradle -q test | ||
+ | Evaluation of root project ' | ||
+ | Evaluation of project ': | ||
+ | Evaluation of project ': | ||
+ | </ | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | * 최상위 '' | ||
+ | project(': | ||
+ | // .... | ||
+ | } | ||
+ | </ | ||
+ | ==== 태스크 생성 ==== | ||
+ | * 프로젝트에 태스크가 추가된 직후에 알림을 받을 수 있다. 기본값을 설정하거나 태스크가 빌드에 노출되기전에 행위를 추가하고자 할 때 사용한다. | ||
+ | * 각 태스크가 생성된 뒤에 '' | ||
+ | tasks.whenTaskAdded { task -> | ||
+ | task.srcDir = ' | ||
+ | } | ||
+ | |||
+ | task a | ||
+ | |||
+ | println " | ||
+ | </ | ||
+ | * 실행하면 < | ||
+ | > gradle -q a | ||
+ | source dir is src/ | ||
+ | </ | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | ==== 태스크 실행 그래프가 정해진 뒤에 ==== | ||
+ | * 실행할 태스크에 '' | ||
+ | task distribution << { | ||
+ | println "We build the zip with version=$version" | ||
+ | } | ||
+ | |||
+ | task release(dependsOn: | ||
+ | println 'We release now' | ||
+ | } | ||
+ | |||
+ | gradle.taskGraph.whenReady {taskGraph -> | ||
+ | if (taskGraph.hasTask(release)) { | ||
+ | version = ' | ||
+ | } else { | ||
+ | version = ' | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | ==== 태스크 실행 ==== | ||
+ | 어떤 태스크이든 실행 직전과 직후에 알림을 받을 수 있다. | ||
+ | |||
+ | * 태스크 실행과 종료를 로그로 남기는 '' | ||
+ | task ok | ||
+ | |||
+ | task broken(dependsOn: | ||
+ | throw new RuntimeException(' | ||
+ | } | ||
+ | |||
+ | gradle.taskGraph.beforeTask { Task task -> | ||
+ | println " | ||
+ | } | ||
+ | |||
+ | gradle.taskGraph.afterTask { Task task, TaskState state -> | ||
+ | if (state.failure) { | ||
+ | println " | ||
+ | } | ||
+ | else { | ||
+ | println " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * 실행하면 < | ||
+ | > gradle -q broken | ||
+ | executing task ': | ||
+ | done | ||
+ | executing task ': | ||
+ | FAILED | ||
+ | </ | ||
+ | |||
+ | [[http:// |