본문 바로가기
Programming Language 이해하기

gradle 에서 apply from: xxx 은 무슨 의미이지?

by simplify-len 2022. 2. 6.

Photo by Kier In Sight on Unsplash

apply from: xxx 을 이해하기 위해서는 gradle 의 Plugin 을 알아야 합니다.

Gradle 의 Plugin 은 무엇을 하는 걸까요?

프로젝트에 플러그인을 적용하면 플러그인이 프로젝트의 기능을 확장할 수 있습니다. 다음과 같은 작업을 수행할 수 있습니다.
- Gradle 모델 확장(예: 구성할 수 있는 새 DSL 요소 추가)
- 규칙에 따라 프로젝트 구성(예: 새 작업 추가 또는 합리적인 기본값 구성)
- 특정 구성 적용(예: 조직 리포지토리 추가 또는 표준 적용)

프로젝트 빌드 스크립트에 논리를 추가하는 대신 플러그인을 적용하면 많은 이점을 얻을 수 있습니다. 플러그인 적용:

- 재사용을 촉진하고 여러 프로젝트에서 유사한 논리를 유지 관리하는 오버헤드를 줄입니다.
- 높은 수준의 모듈화를 허용하여 이해도와 구성을 향상시킵니다.
- 명령형 논리를 캡슐화하고 빌드 스크립트가 가능한 한 선언적일 수 있도록 합니다.

위 내용은 docs 에서 가져온 것인데, 말이 너무 어려운 것 같고, gradle 의 플러그인은 쉽게 생각해서 gradle 에 특정 Tasks을 추가하고 싶을 때 사용한다고 생각하면 될 것 같습니다. 

 

대표적으로 lombok 을 살펴보면 아래와 같은 텍스트를 추가하면 기능이 추가되니까요.

plugins {
  id "io.freefair.lombok" version "6.3.0"
}

다시 목표로 돌아가서 apply from: xxx 이해하고 싶습니다...

여전히 apply from: xxx 을 이해하기 위해서는 알아야 하는 것들이 있습니다. plugin 은 크게 2가지 유형으로 나누게 됩니다.

 

바이너리 플로그인과 스크립트 플로그인

 바이너리 플러그인은 플러그인 인터페이스를 구현하여 프로그래밍 방식으로 작성되거나 Gradle의 DSL 언어 중 하나를 사용하여 선언적으로 작성됩니다. 바이너리 플러그인은 빌드 스크립트 내, 프로젝트 계층 내 또는 플러그인 jar 외부에 있을 수 있습니다. 

 

스크립트 플러그인은 빌드를 추가로 구성하고 일반적으로 빌드 조작에 대한 선언적 접근 방식을 구현하는 추가 빌드 스크립트입니다. 외부화하고 원격 위치에서 액세스할 수 있지만 일반적으로 빌드 내에서 사용됩니다.

 

바이너리 플로그인은 구현이 간단하기 때문에 스크립트 플로그인으로 시작해서 스크립트 플로그인의 코드 가치가 높아지면 그 때 바이너리 플로그인으로 마이그레이션합니다.

 

그럼 어떻게 사용하는가?

캡슐화되어있는 플러그인을 사용하기 위해서는 2가지 절차를 가지게 됩니다.

 

첫번째는 플러그인을 가져와야 합니다. (docs 에서는 resolve 해야 된다고 하네요.)

두번째는 가져온 플로그인을 (프로젝트에) 적용해야 합니다. (apply)

 

첫번째는 플러그인을 가져와야 합니다. (docs 에서는 resolve 해야 된다고 하네요.)

: 플러그인을 가져와야 한다는 것은 주어진 플러그인을 포함하는 올바른 버전의 jar를 찾아 스크립트 클래스 경로에 추가하는 것을 의미합니다. 플러그인이 해결되면 해당 API를 빌드 스크립트에서 사용할 수 있습니다.

 

두번째는 가져온 플로그인을 (프로젝트에) 적용해야 합니다. (apply)

: 플러그인을 적용 한다는 것은 플러그인 으로 향상시키려는 프로젝트 에서 플러그인의 Plugin.apply(T) 를 실제로 실행하는 것을 의미합니다. 플러그인을 적용하는 것은 멱등성을 가집니다. 즉, 부작용 없이 모든 플러그인을 여러 번 안전하게 적용할 수 있습니다.

 

일반적으로 아래와 같은 코드 형태로 plugin 을 사용합니다.

plugins {
    id 'com.example.hello'
}

위와 같은 형태는 Plugins DSL 을 활용한 형태의 설정입니다. 여기서는 다루지 않고, Plugins DSL 을 활용하지 않는다면 아래와 같은 레거시 형태로 Plugins 를 추가하게 되는데요.

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "io.freefair.gradle:lombok-plugin:6.3.0"
  }
}

apply plugin: "io.freefair.lombok" // look At this !!!

 

 여기서 가장 마지막 줄의 apply plugin: "xx" 가 우리가 주목해야될 부분입니다. 드디어 apply from: "xx" 에 가까운 내용을 찾았습니다.

이 부분인 바이너리 플러그인을 적용하는 코드입니다.

 

위에서 언급한 것과 같이 플러그인은 2가지 유형이 있다고 언급했는데요. apply plugin: "xx" 는 바이너리 플러그인이라면

 

바로 스크립트 플러그인이 apply from: "xx" 입니다.

 

스크립트 플러그인은 빌드 프로젝트 내의 로컬 파일 시스템이나 원격 위치의 스크립트에 적용할 수 있습니다. 그러므로 우리는 apply plugins 을 사용하지 않고, apply from 을 사용한 것입니다. 바이너리 플로그인

apply plugin: JavaPlugin

 

위와 같은 형태를 가지는데, 이때 JavaPlugin 은 의 구현체를 의미하기 때문에 활용될 수 없습니다.
 
 

[ 참고자료 ]

https://docs.gradle.org/current/userguide/plugins.html#sec:what_plugins_do

 

Using Gradle Plugins

Where «plugin id» and «plugin version» must be constant, literal, strings and the apply statement with a boolean can be used to disable the default behavior of applying the plugin immediately (e.g. you want to apply it only in subprojects). No other st

docs.gradle.org

https://docs.gradle.org/current/javadoc/org/gradle/api/Plugin.html

 

Plugin (Gradle API 7.3.3)

A Plugin represents an extension to Gradle. A plugin applies some configuration to a target object. Usually, this target object is a Project, but plugins can be applied to any type of objects.

docs.gradle.org

 

댓글