문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
gradle:multiproject [2012/10/05 20:29] kwon37xi |
gradle:multiproject [2022/07/06 10:20] (현재) kwon37xi [서브 프로젝트간 의존성] |
||
|---|---|---|---|
| 줄 2: | 줄 2: | ||
| * [[http:// | * [[http:// | ||
| * [[http:// | * [[http:// | ||
| + | |||
| + | ====== 최상위 프로젝트의 이름 ====== | ||
| + | '' | ||
| + | < | ||
| + | rootProject.name = ' | ||
| + | </ | ||
| ===== 멀티 프로젝트의 기본 ===== | ===== 멀티 프로젝트의 기본 ===== | ||
| 줄 36: | 줄 42: | ||
| } | } | ||
| // shared 서브 프로젝트에 의존하고 있다. | // shared 서브 프로젝트에 의존하고 있다. | ||
| + | </ | ||
| + | |||
| + | ==== build.gradle 대신 subproject 이름으로 gradle 파일 구성 ==== | ||
| + | * 멀티 모듈 프로젝트를 구성하면 지나치게 많은 '' | ||
| + | * 아래와 같이 '' | ||
| + | |||
| + | <code groovy> | ||
| + | rootProject.children.each {project -> | ||
| + | project.buildFileName = " | ||
| + | } | ||
| </ | </ | ||
| 줄 159: | 줄 175: | ||
| </ | </ | ||
| - | ==== 프로젝트 필터링 ==== | + | ==== 프로젝트 필터링 |
| '' | '' | ||
| + | |||
| + | === 명시하기 === | ||
| + | < | ||
| + | def projects = [project(' | ||
| + | |||
| + | // 특정 프로젝트들에 대한 설정.. | ||
| + | configure(projects) { | ||
| + | .... | ||
| + | } | ||
| + | </ | ||
| === 이름으로 필터링 === | === 이름으로 필터링 === | ||
| 줄 478: | 줄 504: | ||
| * [[http:// | * [[http:// | ||
| - | ===== 프로젝트 | + | ===== 프로젝트 |
| 한 프로젝트가 다른 프로젝트의 컴파일 결과와 그 의존하는 라이브러리들 모두에 의존하는 경우가 발생한다. 이 때 프로젝트간 의존성을 설정한다. | 한 프로젝트가 다른 프로젝트의 컴파일 결과와 그 의존하는 라이브러리들 모두에 의존하는 경우가 발생한다. 이 때 프로젝트간 의존성을 설정한다. | ||
| 줄 534: | 줄 560: | ||
| } | } | ||
| </ | </ | ||
| + | * lib 의존성은 실행시 의존성의 특별한 형태이다. 의존성이 걸리게 되면 다른 프로젝트가 먼저 빌드하여 jar를 생성하고 그것을 현재 프로젝트의 클래스패스에 추가한다. | ||
| + | * 따라서 api 디렉토리에서 '' | ||
| + | * Ivy 방식의 매우 상세한 의존성 설정도 가능하다. | ||
| + | * '' | ||
| + | subprojects { | ||
| + | apply plugin: ' | ||
| + | group = ' | ||
| + | version = ' | ||
| + | } | ||
| + | |||
| + | project(': | ||
| + | configurations { | ||
| + | spi | ||
| + | } | ||
| + | dependencies { | ||
| + | compile project(': | ||
| + | } | ||
| + | task spiJar(type: | ||
| + | baseName = ' | ||
| + | dependsOn classes | ||
| + | from sourceSets.main.output | ||
| + | include(' | ||
| + | } | ||
| + | artifacts { | ||
| + | spi spiJar | ||
| + | } | ||
| + | } | ||
| + | |||
| + | project(': | ||
| + | dependencies { | ||
| + | compile project(': | ||
| + | compile project(path: | ||
| + | testCompile " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | * Java 플러그인은 기본적으로 프로젝트당 모든 클래스를 포함한 하나의 jar를 생성한다. 위 예제에서는 api 프로젝트의 인터페이스만 포함하는 추가적인 jar를 생성하였다. | ||
| + | |||
| + | ==== 의존하는 프로젝트의 빌드 금지하기 ==== | ||
| + | * 때로는 부분 빌드를 할 때 의존하고 있는 프로젝트를 빌드하지 않기를 바랄 때도 있다. '' | ||
| + | |||
| + | ===== 분리된(decoupled) 프로젝트 ===== | ||
| + | * 두 프로젝트간의 프로젝트 모델에 접근하지 않는 것을 서로 분리된(decoupled) 프로젝트라고 부른다. | ||
| + | * 분리된 프로젝트는 프로젝트 의존성이나 태스크 의존성으로만 연결되어 있다. | ||
| + | * 그 외의 어떠한 형태의 프로젝트간 소통행위( 다른 프로젝트의 값을 읽거나 수정하는 등)은 두 프로젝트를 엮인(coupled) 프로젝트로 만든다. | ||
| + | * 엮인 프로젝트가 되는 가장 일반적인 상황은 교차 프로젝트 설정에서 구성 주입을 사용할 경우이다. | ||
| + | * '' | ||
| + | |||
| + | ===== 멀티 프로젝트 빌드와 테스트 ===== | ||
| + | * Java 플러그인의 '' | ||
| + | * 다중 프로젝트에서 여러 범위의 프로젝트에 대해 빌드를 할 경우가 있는데 이 때 '' | ||
| + | * " | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ===== 프라퍼티와 메소드 상속 ===== | ||
| + | * 프로젝트에 정의된 프라퍼티와 메소드는 모든 서브 프로젝트로 상속된다. | ||
| + | * 이 때문에 '' | ||
| + | |||
| + | ===== 멀티 프로젝트 단위 테스트간의 의존성 ===== | ||
| + | * 이제는 더이상 아래 방법을 사용하지 말고 [[gradle: | ||
| + | <note warning> | ||
| + | 아래 방법은 사용하지 말 것. | ||
| + | |||
| + | 테스트들 간의 의존성을 거는 것은 어쩔 수 없을때만한다. | ||
| + | |||
| + | 꼭 필요하다면 테스트를 위한 별도 모듈을 만들고 그에 대해 일반적인 의존을 하게 변경한다. | ||
| + | </ | ||
| + | |||
| + | 개인적으로 아래 방법보다는 공통 단위 테스트용 프로젝트를 만들고(예: | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ProjectA와 ProjectB의 단위테스트가 존재하는데, | ||
| + | 단위 테스트는 프로젝트간 의존성에서 제외되기 때문이다. | ||
| + | [[http:// | ||
| + | |||
| + | * ProjectB의 '' | ||
| + | dependencies { | ||
| + | testCompile project(': | ||
| + | // 이 방법은 eclipse에서 projecA의 단위 테스트 디렉토리를 라이브러리로 등록하는 문제가 있음. | ||
| + | } | ||
| + | </ | ||
| + | * 위 방법보다는 configuration을 사용하는 다른 방법이 더 유용하다. [[gradle: | ||
| + | configurations { | ||
| + | crosstest | ||
| + | testCompile.extendsFrom crosstest | ||
| + | } | ||
| + | |||
| + | dependencies { | ||
| + | crosstest project(': | ||
| + | } | ||
| + | |||
| + | eclipse { | ||
| + | classpath { | ||
| + | minusConfigurations += configurations.crosstest // 불필요한 classpath 등록 방지 | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 참조 ===== | ||
| + | * [[https:// | ||
| + | |||