본문 바로가기
ANDROID/Android Gradle

[Android/Gradle] project build.gradle apply false

by 주 녕 2024. 9. 22.
반응형

 

회사 프로젝트에서 라이브러리 배포를 담당하게 되었다. 그리고 사이드 프로젝트를 시작하면서 gradle과 가까워질 일들이 많아서 블로그에 gradle 카테고리를 생성하게 되었다. 이번 사이드 프로젝트 세팅을 하던 중 궁금한 부분이 생겨 글을 작성한다.

 

 

Build.gradle.kts (Project: ~)

Hilt 플러그인 세팅을 위해 이 부분을 건들이다 궁금증이 들었다. 왜 항상 apply false일까?

 

  • default가 true라 없애고 sync를 해보았다
  • 이 플러그인은 Android project에만 적용이 가능하다고 한다

 

추측

처음에는 apply true로 sync하면 모든 모듈에 해당 플러그인이 적용이 된다고 생각했다.
  • 저 위의 hilt 플러그인 에러는 내 프로젝트(멀티 모듈로 구성)에 Kotlin/Java Module이 있어 발생한 것이라고 추측했다.
  • 그래서 이런 시도를 해보았다.
    1. Kotlin/Java Module에는 Android 라이브러리를 사용할 수 없으니, settings.gradle에서 해당 모듈 include 삭제 후 sync
    2. 다시 apply false를 지운채로 sync → 똑같은 에러 발생
    3. 🤨 ?! 내 추측과 다른 결과 발생
    4. 모든 모듈에 해당 plugin을 적용할 수 있는 상태임에도 에러가 나는 이유가 무엇일까?

 

package org.gradle.kotlin.dsl

public infix fun org.gradle.plugin.use.PluginDependencySpec.apply(apply: kotlin.Boolean): org.gradle.plugin.use.PluginDependencySpec { /* compiled code */ }
...

 

음... 봐도 모르겠다.

 

  • stack overflow의 한 답변에서는 'apply false는 프로젝트 전반에는 적용하지만 root project에는 하지 않는 플러그인에 사용한다. 다시 sub project의 plugins 블록에 플러그인을 추가해서 사용한다' 라고 말하고 있다.

 

Gradle 공식문서

  • 어떤 plugin은 일부 또는 전체 sub project에 적용하고 싶지만, root project에는 적용하고 싶지 않을 수 있다
  • ▶︎ 즉시 plugin 블록을 resolve하고 apply하지만, apply false를 하면 현재 project에는 apply하지 말라고하는 syntax
  • multi-project : 1개의 root project와 1개 이상의 sub project들로 구성된 project 

Gradle에서는 multi-project build가 standard라고 한다.

 

PluginDependencySpec apply​(boolean apply)
Specifies whether the plugin should be applied to the current project. Otherwise it is only put on the project's classpath.
This is useful when reusing classes from a plugin or to apply a plugin to sub-projects:

 plugins {
     id "org.company.myplugin" version "1.0" apply false
 }

 subprojects {
     if (someCondition) {
         apply plugin: "org.company.myplugin"
     }
 }
 
Parameters:
apply - whether to apply the plugin to the current project or not. Defaults to true
Returns:
this
  • apply 함수에 대한 설명
    • 현재 프로젝트에 플러그인을 적용할지 여부를 지정합니다.
    • 그렇지 않으면 프로젝트의 클래스 경로(classpath)에만 플러그인이 적용됩니다.
    • 이 기능은 플러그인에서 클래스를 재사용하거나 하위 프로젝트에 플러그인을 적용할 때 유용합니다.
  • project 수준의 build.gradle에서 sub project에 적용할 build script를 한번에 작성할 수 있다니..!
    • multi module을 하다보면 여러 개의 module 단위의 build.gradle 파일이 생김 → 발생하는 중복 코드 많음
    • 그 코드들을 subprojects 블록 안에서 관리할 수 있을 것 같다.
    • 전체적으로 적용하고 싶다면 apply true로 하고, 일부만 적용하고 싶다면 apply false로 하면 되는 것 같다.
  • Hilt 플러그인의 경우, Android 모듈만을 위한 플러그인이라 root project에는 적용을 못하게 막아둔게 아닐까 하는 추측...
    • 이 부분은 공부를 추가적으로 하고 업데이트 하겠습니다...🥲

 

 

 

*글에 대한 조언과 지적은 언제나 환영입니다. 오늘도 읽어주셔서 감사합니다 :)


블로그 운영을 하지 않으면서 그동안 version catalog를 사용한다던지, groovy에서 kts로 마이그레이션 한다던지 익숙하게 쓰던 것들에 대해 변화가 있었다. 아직도 새로운 것에 대한 기록의 장점과 단점 사이의 딜레마에 빠져있지만 꾸준한 것의 힘을 믿고 다시 열심히 해보려고 한다.

 

Reference >

반응형

댓글