Project 수준의 build.gradle에서 모듈 수준의 build.gradle 제어하기
멀티 모듈 프로젝트를 만들다보면, 모든 모듈에 dependencies나 task들이 적용되어야 하는 경우가 있다. 이를 위해 프로젝트 수준의 build.gradle에서 모듈 수준의 build.gradle을 제어해야 할 경우가 생긴다. 이를 위해 Gradle에서는 allprojects, subprojects, project 메서드를 제공하는데 이번 글에서는 이 메서드들을 다루어볼 것이다.
- allprojects : 프로젝트 수준의 build.gradle 뿐만 아니라 해당 프로젝트에 포함된 모든 모듈의 build.gradle을 제어
- subprojects : 해당 프로젝트에 포함된 모든 모듈의 build.gradle을 제어
- project : 특정 모듈만 제어
allprojects 메서드를 활용한 모든 모듈 제어
allprojects 메서드는 프로젝트 수준의 build.gradle 뿐만 아니라 해당 프로젝트에 포함된 모든 모듈의build.gradle 스크립트를 제어한다.
allprojects {
[모든 모듈에 적용할 gradle script]
}
예를 들어 모든 프로젝트에 printProjectName이라는 task를 넣고 싶은 경우 프로젝트 수준의 build.gradle에 allProjects 블록을 넣고 그 내부에 task를 넣으면 된다.
allprojects {
task printProjectName {
println "kotlinworld"
}
}
실제 적용 화면은 다음과 같다. printProjectName task는 SimpleTodo 프로젝트 뿐만 아니라 내부의 모듈인 app 모듈에도 적용된다.
subprojects 메서드를 이용한 서브모듈 제어
subprojects 메서드는 프로젝트 수준의 build.gradle을 제외한 모든 모듈(서브 모듈)의 build.gradle을 제어한다.
subprojects {
[서브 모듈만을 위한 Gradle Script]
}
예를 들어 서브모듈을 위한 task 인 taskOnlyForSubModules를 서브모듈에만 생성하려면 다음과 같이 쓰면 된다.
subprojects {
task taskOnlyForSubModules {
println "submodule only task"
}
}
그렇게 되면 서브모듈인 app 모듈의 build.gradle에 위 taskOnlyForSubModules task가 들어간다.
project 메서드를 활용한 특정 모듈 제어
특정 모듈에만 Gradle 스크립트를 추가하고 싶다면 project 메서드를 쓰면 된다. allprojects나 subprojects와 다르게 특정 모듈의 build.gradle에만 스크립트가 추가된다.
*왠만하면 해당 모듈의 build.gradle에 스크립트를 넣고 이 방식은 지양해야 한다. 외부에서 제어하는 것이 많아지면 모듈간 독립성이 보장되지 않기 때문이다. 모듈 간 의존성 정도만 설정하는 것이 좋다.
project(“:[모듈명]”){
[모듈에 적용한 Gradle Script]
}
예를 들어 app module이 usecase 모듈을 의존하는 경우 다음과 같이 설정하면 된다.
project(“:app”){
dependencies {
implementation project(“:usecase”)
}
}