Gradle에 대해 알아보자 #2 - Gradle 빌드 짜보기

햄햄·2023년 2월 26일
0

Gradle

목록 보기
2/3

Gradle은 의존성 기반 프로그래밍의 한 예로, 태스크와 태스크 간의 의존성을 정의한다. Gradle은 이 태스크들이 의존성 순서대로 실행되도록 보장한다. 빌드 스크립트와 플러그인은 의존성 그래프(dependency graph)를 구성한다.

태스크 그래프

Gradle은 테스크를 실행하기 전에 태스크 그래프를 빌드한다. 구성 회피 기능(configuration avoidance)을 사용하면 현재 빌드에 포함되지 않은 태스크에 대한 구성을 건너뛴다.

이 다이어그램은 추상적인 태스크 그래프와 구체적인 태스크 그래프를 보여준다. 태스크간의 의존성은 화살표로 표시된다.

빌드 단계

초기화

  • 설정 파일을 검색한다.
  • 설정 파일을 평가하여 어떤 프로젝트와 빌드가 빌드에 포함되는지 결정한다.
  • 모든 프로젝트에 Project 인스턴스를 생성한다.

구성

  • 빌드에 포함된 모든 프로젝트의 빌드 스크립트를 평가한다.
  • 요청된 태스크에 대한 태스크 그래프를 생성한다.

실행

  • 선택된 각 태스크를 의존성 순서대로 예약하고 실행한다.

예제

다음 예는 설정 파일 및 빌드 파일의 어느 부분이 어떤 빌드 단계에 해당되는지 보여준다.

// settings.gradle
rootProject.name = 'basic'
println '초기화 단계에서 실행된다'

// build.gradle
println '구성 단계에서 실행된다.'

tasks.register('configured') {
    println '구성은 빌드에 사용되기 때문에 구성 단계에서 실행된다.'
}

tasks.register('test') {
    doLast {
        println '실행 단계에서 실행된다.'
    }
}

tasks.register('testBoth') {
	doFirst {
	  println '실행 단계에서 첫번째로 실행된다.'
	}
	doLast {
	  println '실행 단계에서 마지막에 실행된다.'
	}
	println 'testBoth는 빌드에서 사용되기 때문에 구성 단계에서 실행된다.'
}

Gradle 플러그인 사용하기

Gradle은 자주 사용되는 기능의 자동화를 의도적으로 거의 제공하지 않는다. Java 코드 컴파일과 같은 모든 유용한 기능은 플러그인을 통해 추가된다. 플러그인은 새로운 작업(예: JavaCompile), 도메인 객체(예: SourceSet), 규칙(예: Java 소스는 src/main/java에 위치)을 추가한다.

플러그인이 하는 일

  • Gradle 모델 확장(예: 새 DSL 요소 추가)
  • 컨벤션을 따른 프로젝트 구성(예: 새 태스크 추가 또는 합리적인 기본값 구성)
  • 특정 구성 적용(예: 조직 리포지토리 추가 또는 표준 적용)

빌드 스크립트에 로직을 추가하는 대신 플러그인을 적용하면 여러 가지 이점을 얻을 수 있다

  • 재사용을 촉진하고 여러 프로젝트에서 유사한 로직을 유지 관리하는 데 드는 오버헤드 감소
  • 더 높은 수준의 모듈화가 가능하여 이해도와 체계성 향상
  • 명령형 로직을 캡슐화하여 빌드 스크립트를 최대한 선언적으로 작성

사용하기

플러그인에 캡슐화된 빌드 로직을 사용하려면 Gradle은 두 단계를 수행해야 한다. 먼저 플러그인을 확인한 다음 플러그인을 대상(일반적으로 프로젝트)에 적용해야 한다.

플러그인을 확인한다는 것은 해당 플러그인이 포함된 올바른 버전의 jar를 찾아 스크립트 클래스 경로에 추가하는 것을 의미한다. 플러그인이 확인되면 해당 API를 빌드 스크립트에서 사용할 수 있다.

플러그인을 적용한다는 것은 해당 플러그인의 Plugin.apply(T)를 실제로 실행하는 것을 의미한다. 플러그인 적용은 멱등성이 있다. 즉, 어떤 플러그인이든 사이드이펙트 없이 안전하게 여러 번 적용할 수 있다는 것이다.

플러그인의 가장 일반적인 용례는 플러그인을 리졸브하고 현재 프로젝트에 적용하는 것이다. 일반적인 용례이므로 빌드 작성자는 플러그인 DSL을 사용하여 플러그인 리졸브와 적용을 한 번에 수행하는 것이 좋다.

profile
@Ktown4u 개발자

0개의 댓글