Gradle Plugin이란?
Plugin이란 Gradle Task의 집합이다. Gradle Task는 어플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 작업 단위를 뜻한다.
*만약 Task에 대한 이해가 부족하다면 다음글을 참조하길 바란다.
Plugin을 우리가 특정 작업(어플리케이션 개발 등)을 하기 위해서 모아놓은 Task 들의 묶음이다.
예를 들어 안드로이드 어플리케이션을 개발하기 위해서는 필요한 라이브러리들을 받아온 후 해당 라이브러리들을 사용해 코틀린이나 자바 코드를 컴파일하고, 컴파일된 바이트코드의 묶음을 패키징 해 apk나 aab 파일로 만들어야 한다. 추가적으로 DB와 통신하는 부분들에 문제가 없는지, 서버와 통신하는 부분들에 문제가 없는지에 대한 테스트를 돌리기도 해야 한다.
이러한 작업들은 모두 Gradle 파일에서 Task 단위로 이루어지는데 대표적으로 assembleRelease, build, test 등의 Task가 존재한다. 하지만 이러한 작업들을 일일히 Gradle 파일에 정의 해놓으면 매우 비효율적이므로 이를 미리 안드로이드 개발사인 구글이나 IDE 개발사인 JetBrains에서 미리 만들은 다음 Plugin 형태로 묶어놓는다.
따라서 우리가 안드로이드의 신규 프로젝트를 만들면 다음과 같이 'com.android.application', 'org.jetbrains.kotlin.android' 두개의 플러그인을 apply 해놓은 것을 볼 수 있다.
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
위 두개의 Plugin들을 적용시키면 다음과 같은 수많은 gradle Task들이 Gradle 파일로 들어온다. 따라서 gradle tasks --all을 수행해 사용할 수 있는 task의 목록을 출력시키면 다음과 같이 나온다.
$ gradle tasks --all // 모든 Task 출력
Build tasks
-----------
app:assemble - Assemble main outputs for all the variants.
app:assembleAndroidTest - Assembles all the Test applications.
app:build - Assembles and tests this project.
app:buildDependents - Assembles and tests this project and all projects that depend on it.
app:buildNeeded - Assembles and tests this project and all projects it depends on.
app:bundle - Assemble bundles for all the variants.
app:clean - Deletes the build directory.
...
Other tasks
-----------
app:analyzeDebugAndroidTestDependencies
app:analyzeDebugDependencies
app:analyzeDebugUnitTestDependencies
app:analyzeReleaseDependencies
app:analyzeReleaseUnitTestDependencies
app:assembleDebug - Assembles main output for variant debug
app:assembleDebugAndroidTest - Assembles main output for variant debugAndroidTest
app:assembleDebugUnitTest - Assembles main output for variant debugUnitTest
app:assembleRelease - Assembles main output for variant release
app:assembleReleaseUnitTest - Assembles main output for variant releaseUnitTest
..
우리가 만약 빌드 파일을 만들어내는 gradle assembleRelease 를 동작시키면 위의 작업들 중 app:assembleRelease가 돌아가고 빌드 파일이 떨어지게 된다
$ gradle assembleRelease
참고로 안드로이드는 최상위 프로젝트가 있고, app 모듈 내부에 plugin을 import하므로, app:assembleRelease가 gradle task 목록에 존재하는 것이다.
커스텀 플러그인
커스텀 플러그인 만들기
커스텀 플러그인을 만들기 위해서는 buildSrc의 src/main/kotlin 폴더에 Plugin<Project> 인터페이스를 구현하는 구현체를 만들어야 한다.
예를 들어 MyPlugin이라 불리는 커스텀 플러그인을 만들려면 다음과 같이 Plugin<Project>를 구현해야 한다. Plugin<Project> 인터페이스는 apply 메서드만 만들어주면 되는 인터페이스이다. apply는 Project 객체를 인자로 받아 Project 객체에 task를 넣어주거나, Project 객체의 프로퍼티를 설정할 수 있다. 이 글에서는 "newTask"와 "customTask" 두개만 만들어 낸다.
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin<Project>{
public void apply(Project project) {
project.task("newTask"){
doFirst{
}
}
project.task("customTask"){
doLast{
println "customTask"
}
}
}
}
시각적으로 보면 다음과 같이 생성된다.
커스텀 플러그인 적용하기
위와 같이 커스텀 플러그인이 만들어졌으면 apply plugin 을 이용해 build.gradle 파일에 적용할 수 있다. import를 해주지 않으면 org.gradle.plugin을 모두 써야한다.
apply plugin: [Plugin 이름]
커스텀 플러그인 적용 확인하기
gradle tasks --all 메서드를 이용해 customTask와 newTask가 생성된 것을 확인할 수 있다.
$ gradle tasks --all
...
app:customTask
...
app:newTask
...
커스텀 플러그인 Task 실행하기
Task를 실행하기 위해서는 다음과 같이 쓰면 된다.
$ gradle [모듈명]:[Task명]
우리가 만든 MyPlugin 플러그인이 app 모듈에 적용되었으므로 gradle app:customTask를 통해 만든 task를 실행할 수 있다.
*모든 프로젝트에서 해당 Task를 수행하려면 모듈명을 생략하고 쓰면 된다. 만약 모듈 명을 빼고 사용한다면 멀티모듈 프로젝트일 때 모든 모듈에서 해당 Task가 수행된다. 단 위 customTask가 모든 프로젝트에서 수행되려면 모든 모듈에 해당 플러그인이 apply 되어있어야 한다.
$ gradle [Task명]
실행하면 다음과 같이 나오는 것을 확인할 수 있다.
$ gradle app:customTask
> Task :app:customTask
customTask
BUILD SUCCESSFUL in 394ms
8 actionable tasks: 1 executed, 7 up-to-date