목차

Gradle Multi Project

최상위 프로젝트의 이름

settings.gradle 파일에서 다음과 같이 최상위 프로젝트 이름을 지정한다. 이는 해당 프로젝트 디렉토리 이름과 무관하게 설정된다.

rootProject.name = '프로젝트이름'

멀티 프로젝트의 기본

서브 프로젝트간 의존성

// 어느 서브 프로젝트의 build.gradle
dependencies {
    compile project(':shared')
}
// shared 서브 프로젝트에 의존하고 있다.

build.gradle 대신 subproject 이름으로 gradle 파일 구성

rootProject.children.each {project ->
    project.buildFileName = "${project.name}.gradle"
}

교차 프로젝트 구성 Cross Project Configuration

공통 행위 정의하기

서브 프로젝트 구성

Project.subprojects로 서브 프로젝트들만 접근하는 것도 가능하다. allprojects는 부모 프로젝트까지 포함한 것이다.

공통 행위 정의

특정 서브 프로젝트에만 행위 추가

프로젝트 필터링 Filter Projects

tropicalFish라는 프로젝트를 추가하고 water 프로젝트 빌드 파일에 행위를 더 추가해보자.

명시하기

def projects = [project('project-name'), project('project-name-2')]

// 특정 프로젝트들에 대한 설정..
configure(projects) {
    ....
}

이름으로 필터링

프라퍼티로 필터링하기

ext 프라퍼티를 통해 필터링이 가능하다.

멀티 프로젝트 빌드 실행 규칙

절대 경로로 태스크 실행하기

프로젝트와 태스크의 경로

의존성 - 어느 의존성을 선택하지?

의존성과 실행 순서에 대해서 확인해보자.

실행 의존성

의존성과 실행 순서

태스크 실행 의존성 선언하기

교차 프로젝트 태스크 의존성의 특징

구성 시(Configuration Time) 의존성 설정하기

실전 예제

두 개의 웹 애플리케이션 서브 프로젝트를 가진 최상위 프로젝트가 웹 애플리케이션 배포본을 생성하는 예를 본다. 예제에서는 단 하나의 교차 프로젝트 구성을 사용한다.

프로젝트 lib 의존성

한 프로젝트가 다른 프로젝트의 컴파일 결과와 그 의존하는 라이브러리들 모두에 의존하는 경우가 발생한다. 이 때 프로젝트간 의존성을 설정한다.

의존하는 프로젝트의 빌드 금지하기

분리된(decoupled) 프로젝트

멀티 프로젝트 빌드와 테스트

프라퍼티와 메소드 상속

멀티 프로젝트 단위 테스트간의 의존성

아래 방법은 사용하지 말 것.

테스트들 간의 의존성을 거는 것은 어쩔 수 없을때만한다.

꼭 필요하다면 테스트를 위한 별도 모듈을 만들고 그에 대해 일반적인 의존을 하게 변경한다.

개인적으로 아래 방법보다는 공통 단위 테스트용 프로젝트를 만들고(예: xxx-test-support) 해당 프로젝트에 각종 테스트용 의존성과 테스트용 유틸리티 클래스를 일반 코드로 작성한 뒤에 다른 프로젝트들이 testCompile project(':xxx-test-support') 형태로 의존성을 추가하는 것이 더 일관성 있고 깔끔한 방법으로 보인다.


ProjectA와 ProjectB의 단위테스트가 존재하는데, ProjectB의 단위테스트가 ProjectA의 단위테스트 클래스 중 일부에 의존하고 있다면, 기본적으로는 클래스를 찾지 못해 예외가 발생한다. 단위 테스트는 프로젝트간 의존성에서 제외되기 때문이다. build - Multi-project test dependencies with gradle에 해결책이 있으나 classes가 write-only로 바뀌고 읽을 때는 output을 하도록 바뀌었다.

참조