[Gradle] settings.gradle에 멀티 프로젝트 설정하기
멀티모듈 프로젝트를 구성하기 위해 프로젝트 패키지 루트 경로의 settings.gradle 파일에 각 프로젝트 디렉토리를 설정해줘야했다.
내가 만든 구조는 아래와 같았다.
- boot
- api-server
- batch
- kafka
- core
- domain
- persistence
루트 패키지를 기준으로 쭉쭉 모듈들이 존재하는게 아니라 성격이 비슷한 모듈들을 하나의 디렉토리 내에 모아놓은 형태였다.
루트 패키지 내에 바로 존재하는 모듈을 include해주기 위해선 include 'foo'
처럼 해주므로, 느낌상 특정 디렉토리 하위에 있는 프로젝트는 include 'foo:bar'
처럼 해주면 될 것 같았다.
그래서 아래와 같이 설정했다.
// settings.gradle
rootProject.name = 'multi-module'
include 'boot:api-server'
include 'boot:batch'
include 'boot:kafka'
include 'core:domain'
include 'core:persistence'
하지만 결과는.. 띠용이었다.
예상대로라면 실제 모듈인 api-server
, batch
, kafka
, domain
, persistence
만 gradle에 잡혀야할 것 같은데, 단순 디렉토리일 뿐인 boot와 core 또한 gradle에 잡혔다.
뇌피셜은 그만두고 공식 문서에 적힌 예시를 보자 헤헤
// include two projects, 'foo' and 'foo:bar'
// directories are inferred by replacing ':' with '/'
include 'foo:bar'
내가 예상했던 include 'foo:bar'
는 'foo' 안에 있는 'bar'
를 설정하는게 아니라 'foo'
와 'bar'
를 모두 프로젝트로 등록하는 것이었다.
특정 디렉토리 내에 속한 프로젝트를 등록해주기 위해선, 아래와 같이 해당 프로젝트의 물리적인 위치를 직접 설정해줘야한다.
// include one project whose project dir does not match the logical project path
include 'baz'
project(':baz').projectDir = file('foo/baz')
즉, 기존 settings.gradle
은 아래와 같이 수정되어야한다.
// settings.gradle
rootProject.name = 'multi-module'
include 'api-server'
project(':api-server').projectDir = file('boot/api-server')
include 'batch'
project(':batch').projectDir = file('boot/batch')
include 'kafka'
project(':kafka').projectDir = file('boot/kafka')
include 'domain'
project(':domain').projectDir = file('core/domain')
include 'persistence'
project(':persistence').projectDir = file('core/persistence')
내가 원한대로 단순 디렉토리인 boot와 core는 빠지고 실제 모듈만 프로젝트로 잘 등록된 것을 확인할 수 있었다.
물론, 각 프로젝트를 일일이 적어주는게 매우 불편해보인다.
이런 상황에서 적용할 수 있는 특정 디렉토리에 포함된 모든 프로젝트를 등록하는 예시도 있다.
// include many projects whose project dirs do not match the logical project paths
file('subprojects').eachDir { dir ->
include dir.name
project(":${dir.name}").projectDir = dir
}
위 예시를 적용해보면, 다음과 같이도 수정될 수 있다.
file('core').eachDir { dir ->
include dir.name
project(":${dir.name}").projectDir = dir
}
file('boot').eachDir { dir ->
include dir.name
project(":${dir.name}").projectDir = dir
}