사용자 도구

사이트 도구


gradle:multiproject

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
gradle:multiproject [2012/10/05 21:01]
kwon37xi [분리된 프로젝트]
gradle:multiproject [2022/07/06 10:20] (현재)
kwon37xi [서브 프로젝트간 의존성]
줄 2: 줄 2:
   * [[http://www.gradle.org/docs/current/userguide/multi_project_builds.html|Gradle Multi Project Builds]]   * [[http://www.gradle.org/docs/current/userguide/multi_project_builds.html|Gradle Multi Project Builds]]
   * [[http://gradle.org/docs/current/dsl/org.gradle.api.Project.html|Project]] DSL 참조.   * [[http://gradle.org/docs/current/dsl/org.gradle.api.Project.html|Project]] DSL 참조.
 +
 +====== 최상위 프로젝트의 이름 ======
 +''settings.gradle'' 파일에서 다음과 같이 최상위 프로젝트 이름을 지정한다. 이는 해당 프로젝트 디렉토리 이름과 무관하게 설정된다.
 +<code>
 +rootProject.name = '프로젝트이름'
 +</code>
  
 ===== 멀티 프로젝트의 기본 ===== ===== 멀티 프로젝트의 기본 =====
줄 36: 줄 42:
 } }
 // shared 서브 프로젝트에 의존하고 있다. // shared 서브 프로젝트에 의존하고 있다.
 +</code>
 +
 +==== build.gradle 대신 subproject 이름으로 gradle 파일 구성 ====
 +  * 멀티 모듈 프로젝트를 구성하면 지나치게 많은 ''build.gradle'' 파일 때문에 혼란스러워진다.
 +  * 아래와 같이 ''settings.gradle'' 에 설정하여 각각의 sub module 들에 대한 설정 파일을 ''submodule-name.gradle''로 변경할 수 있다.
 +
 +<code groovy>
 +rootProject.children.each {project ->
 +    project.buildFileName = "${project.name}.gradle"
 +}
 </code> </code>
  
줄 159: 줄 175:
 </code> </code>
  
-==== 프로젝트 필터링 ====+==== 프로젝트 필터링 Filter Projects ====
 ''tropicalFish''라는 프로젝트를 추가하고 ''water'' 프로젝트 빌드 파일에 행위를 더 추가해보자. ''tropicalFish''라는 프로젝트를 추가하고 ''water'' 프로젝트 빌드 파일에 행위를 더 추가해보자.
 +
 +=== 명시하기 ===
 +<code>
 +def projects = [project('project-name'), project('project-name-2')]
 +
 +// 특정 프로젝트들에 대한 설정..
 +configure(projects) {
 +    ....
 +}
 +</code>
  
 === 이름으로 필터링 === === 이름으로 필터링 ===
줄 591: 줄 617:
   * ''gradle :api:buildDependents'' : api와 api에 의존하는 모든 프로젝트에 대해 build를 수행한다.   * ''gradle :api:buildDependents'' : api와 api에 의존하는 모든 프로젝트에 대해 build를 수행한다.
   * ''gradle build'' : 모든 프로젝트에 대해 build한다.   * ''gradle build'' : 모든 프로젝트에 대해 build한다.
 +
 +===== 프라퍼티와 메소드 상속 =====
 +  * 프로젝트에 정의된 프라퍼티와 메소드는 모든 서브 프로젝트로 상속된다.
 +  * 이 때문에 ''gradle 태스크이름 -P프라퍼티이름=값''으로 실행할 경우 모든 ''project'' 객체에서 해당 프라퍼티를 사용할 수 있게 된다.
 +
 +===== 멀티 프로젝트 단위 테스트간의 의존성 =====
 +  * 이제는 더이상 아래 방법을 사용하지 말고 [[gradle:testfixtures|TestFixtures]]를 통해 합리적으로 해결 가능해졌다.
 +<note warning>
 +아래 방법은 사용하지 말 것.
 +
 +테스트들 간의 의존성을 거는 것은 어쩔 수 없을때만한다.
 +
 +꼭 필요하다면 테스트를 위한 별도 모듈을 만들고 그에 대해 일반적인 의존을 하게 변경한다.
 +</note>
 +
 +개인적으로 아래 방법보다는 공통 단위 테스트용 프로젝트를 만들고(예: ''xxx-test-support'') 해당 프로젝트에 각종 테스트용 의존성과 테스트용 유틸리티 클래스를 일반 코드로 작성한 뒤에 다른 프로젝트들이 ''testCompile project(':xxx-test-support')'' 형태로 의존성을 추가하는 것이 더 일관성 있고 깔끔한 방법으로 보인다.
 +
 +----
 +
 +ProjectA와 ProjectB의 단위테스트가 존재하는데, ProjectB의 단위테스트가 ProjectA의 단위테스트 클래스 중 일부에 의존하고 있다면, 기본적으로는 클래스를 찾지 못해 예외가 발생한다.
 +단위 테스트는 프로젝트간 의존성에서 제외되기 때문이다.
 +[[http://stackoverflow.com/questions/5644011/multi-project-test-dependencies-with-gradle|build - Multi-project test dependencies with gradle]]에 해결책이 있으나 ''classes''가 write-only로 바뀌고 읽을 때는 ''output''을 하도록 바뀌었다.
 +
 +  * ProjectB의 ''build.gradle'' <code groovy>
 +dependencies {
 +    testCompile project(':projectA').sourceSets.test.output // projectA의 단위 테스트 클래스에 의존함.
 +    // 이 방법은 eclipse에서 projecA의 단위 테스트 디렉토리를 라이브러리로 등록하는 문제가 있음.
 +}
 +</code>
 +  * 위 방법보다는 configuration을 사용하는 다른 방법이 더 유용하다. [[gradle:eclipse|Gradle Ecplise Plugin]] 사용시 설정 필요 ''build.gradle'' <code groovy>
 +configurations {
 +    crosstest
 +    testCompile.extendsFrom crosstest  // testCompile이 crosstest에 의존하게 변경
 +}
 +
 +dependencies {
 +    crosstest project(':projectA').sourceSets.test.output
 +}
 +
 +eclipse {
 +    classpath {
 +        minusConfigurations += configurations.crosstest // 불필요한 classpath 등록 방지
 +    }
 +}
 +</code>
 +
 +===== 참조 =====
 +  * [[https://blog.sapzil.org/2018/06/20/gradle-subproject-grouping/|Gradle에서 서브 프로젝트를 한 디렉토리에 몰아넣기 | The Sapzil]]
 +
gradle/multiproject.1349438500.txt.gz · 마지막으로 수정됨: 2012/10/05 21:01 저자 kwon37xi