문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 다음 판 양쪽 다음 판 | ||
gradle:multiproject [2012/10/05 20:16] kwon37xi [구성 시(Configuration Time) 의존성 설정하기] |
gradle:multiproject [2021/03/19 10:50] kwon37xi [멀티 프로젝트 단위 테스트간의 의존성] |
||
---|---|---|---|
줄 2: | 줄 2: | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
+ | |||
+ | ====== 최상위 프로젝트의 이름 ====== | ||
+ | '' | ||
+ | < | ||
+ | rootProject.name = ' | ||
+ | </ | ||
===== 멀티 프로젝트의 기본 ===== | ===== 멀티 프로젝트의 기본 ===== | ||
줄 159: | 줄 165: | ||
</ | </ | ||
- | ==== 프로젝트 필터링 ==== | + | ==== 프로젝트 필터링 |
'' | '' | ||
+ | |||
+ | === 명시하기 === | ||
+ | < | ||
+ | def projects = [project(' | ||
+ | |||
+ | // 특정 프로젝트들에 대한 설정.. | ||
+ | configure(projects) { | ||
+ | .... | ||
+ | } | ||
+ | </ | ||
=== 이름으로 필터링 === | === 이름으로 필터링 === | ||
줄 472: | 줄 488: | ||
} | } | ||
</ | </ | ||
+ | * 최상위 프로젝트에서 '' | ||
* date와 hello 프로젝트는 webDist 프로젝트의 구성시 의존성을 가진 상태이다. 그리고 빌드 로직도 webDist에서 주입되었다. | * date와 hello 프로젝트는 webDist 프로젝트의 구성시 의존성을 가진 상태이다. 그리고 빌드 로직도 webDist에서 주입되었다. | ||
* 하지만 실행시 의존성은 webDist가 date와 hello의 빌드된 아티팩트에 의존한다. | * 하지만 실행시 의존성은 webDist가 date와 hello의 빌드된 아티팩트에 의존한다. | ||
* 세번째 의존성으로 webDist가 자식인 date와 hello에 구성시 의존성도 있는데, 이는 '' | * 세번째 의존성으로 webDist가 자식인 date와 hello에 구성시 의존성도 있는데, 이는 '' | ||
- | * | + | * [[http:// |
+ | |||
+ | ===== 프로젝트 lib 의존성 ===== | ||
+ | 한 프로젝트가 다른 프로젝트의 컴파일 결과와 그 의존하는 라이브러리들 모두에 의존하는 경우가 발생한다. 이 때 프로젝트간 의존성을 설정한다. | ||
+ | |||
+ | * 프로젝트 레이아웃< | ||
+ | java/ | ||
+ | settings.gradle | ||
+ | build.gradle | ||
+ | api/ | ||
+ | src/ | ||
+ | org/ | ||
+ | api/ | ||
+ | Person.java | ||
+ | apiImpl/ | ||
+ | PersonImpl.java | ||
+ | services/ | ||
+ | src/ | ||
+ | main/ | ||
+ | org/ | ||
+ | PersonService.java | ||
+ | test/ | ||
+ | org/ | ||
+ | PersonServiceTest.java | ||
+ | shared/ | ||
+ | src/ | ||
+ | org/ | ||
+ | Helper.java | ||
+ | </ | ||
+ | * shared, api, personService 프로젝트가 있다. personService는 다른 두 프로젝트에 의존하고, | ||
+ | * '' | ||
+ | include ' | ||
+ | </ | ||
+ | * '' | ||
+ | subprojects { | ||
+ | apply plugin: ' | ||
+ | group = ' | ||
+ | version = ' | ||
+ | repositories { | ||
+ | mavenCentral() | ||
+ | } | ||
+ | dependencies { | ||
+ | testCompile " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | project(': | ||
+ | dependencies { | ||
+ | compile project(': | ||
+ | } | ||
+ | } | ||
+ | |||
+ | project(': | ||
+ | dependencies { | ||
+ | compile project(': | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * 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 플러그인의 '' | ||
+ | * 다중 프로젝트에서 여러 범위의 프로젝트에 대해 빌드를 할 경우가 있는데 이 때 '' | ||
+ | * " | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ===== 프라퍼티와 메소드 상속 ===== | ||
+ | * 프로젝트에 정의된 프라퍼티와 메소드는 모든 서브 프로젝트로 상속된다. | ||
+ | * 이 때문에 '' | ||
+ | |||
+ | ===== 멀티 프로젝트 단위 테스트간의 의존성 ===== | ||
+ | <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:// |