사용자 도구

사이트 도구


gradle:multiproject

차이

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

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
gradle:multiproject [2012/10/09 18:06]
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>
  
 === 이름으로 필터링 === === 이름으로 필터링 ===
줄 596: 줄 622:
   * 이 때문에 ''gradle 태스크이름 -P프라퍼티이름=값''으로 실행할 경우 모든 ''project'' 객체에서 해당 프라퍼티를 사용할 수 있게 된다.   * 이 때문에 ''gradle 태스크이름 -P프라퍼티이름=값''으로 실행할 경우 모든 ''project'' 객체에서 해당 프라퍼티를 사용할 수 있게 된다.
  
-===== 단위 테스트간의 의존성 =====+===== 멀티 프로젝트 단위 테스트간의 의존성 ===== 
 +  * 이제는 더이상 아래 방법을 사용하지 말고 [[gradle:testfixtures|TestFixtures]]를 통해 합리적으로 해결 가능해졌다. 
 +<note warning> 
 +아래 방법은 사용하지 말 것. 
 + 
 +테스트들 간의 의존성을 거는 것은 어쩔 수 없을때만한다. 
 + 
 +꼭 필요하다면 테스트를 위한 별도 모듈을 만들고 그에 대해 일반적인 의존을 하게 변경한다. 
 +</note> 
 + 
 +개인적으로 아래 방법보다는 공통 단위 테스트용 프로젝트를 만들고(예: ''xxx-test-support'') 해당 프로젝트에 각종 테스트용 의존성과 테스트용 유틸리티 클래스를 일반 코드로 작성한 뒤에 다른 프로젝트들이 ''testCompile project(':xxx-test-support')'' 형태로 의존성을 추가하는 것이 더 일관성 있고 깔끔한 방법으로 보인다. 
 + 
 +---- 
 ProjectA와 ProjectB의 단위테스트가 존재하는데, ProjectB의 단위테스트가 ProjectA의 단위테스트 클래스 중 일부에 의존하고 있다면, 기본적으로는 클래스를 찾지 못해 예외가 발생한다. ProjectA와 ProjectB의 단위테스트가 존재하는데, ProjectB의 단위테스트가 ProjectA의 단위테스트 클래스 중 일부에 의존하고 있다면, 기본적으로는 클래스를 찾지 못해 예외가 발생한다.
 단위 테스트는 프로젝트간 의존성에서 제외되기 때문이다. 단위 테스트는 프로젝트간 의존성에서 제외되기 때문이다.
줄 604: 줄 643:
 dependencies { dependencies {
     testCompile project(':projectA').sourceSets.test.output // projectA의 단위 테스트 클래스에 의존함.     testCompile project(':projectA').sourceSets.test.output // projectA의 단위 테스트 클래스에 의존함.
 +    // 이 방법은 eclipse에서 projecA의 단위 테스트 디렉토리를 라이브러리로 등록하는 문제가 있음.
 } }
 </code> </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.1349773571.txt.gz · 마지막으로 수정됨: 2012/10/09 18:06 저자 kwon37xi