1. Gradle 개념
1.1 Gradle의 중요 기능
성능
- 빌드캐시
- 변경된 것중 꼭 필요한것만 다시 실행
JVM 토대
- Gradle은 JVM위에서 동작한다, 또한 JDK가 필수적으로 설치되어 있어야 한다.
- 사용자 정의 테스크, 플러그인 등의 빌드 로직에서
JAVA API
를 사용할 수 있다.
확장성
- Gradle을 쉽게 확장해 자체 task를 만들 수 있다
IDE 지원
- Intellij등 주요 IDE등에서 gradle을 가져오고 상호작용 가능
빌드 스캔
https://scans.gradle.com/?_ga=2.111392064.553798570.1608338427-2052134233.1608338427
- 빌드 문제를 식별하는데 사용할 수 있는 정보를 제공
- 빌드 성능문제를 식별하는데도 도움이 됨
- scans.gradle.com 에 빌드 스캔을 게시하면 빌드에 대한 정보가 Gradle 서버로 전송됨
1.2 Tasks
- Gradle은
빌드
를 DAG(비순환 방향 그래프) Task 단위로 모델링합니다. - 작업 그래프가 생성되면 gradle은 어떤 task를 어떤 순서로 실행할지를 결정한 다음 진행합니다.
Task 구성
- Actions - 파일을 복사하거나 옮기고 source를 컴파일하는 등의 작업
- inputs - Task가 사용하는 값 파일 및 디렉토리
- ouputs - Task가 수정하거나 생성하는 파일 및 디렉토리
1.3 Gradle 빌드 순서(고정된)
1. 초기화
빌드 환경설정
참여할 프로젝트 결정
2. 구성
- 빌드 Task 그래프를 구성
- 사용자가 실행하려는 Task에 따라 실행할 Task 순서를 결정
3. 실행
- 구성 단계가 끝날 때 선택한 Task를 실행
1.4 확장
gradle에서 번들로 제공되는 Build 로직만 사용하여 프로젝트를 빌드할 수 있다면 좋지만, 거의 불가능합니다. 대부분의 Build 작업에는 사용자가 직접 build task custom해야하는 요구사항들이 존재하기 마련입니다.
이 때문에 Gradle에서는 Task를 확장할 수 있는 방법들을 제공합니다.
Custom Task Type
이미 존재하는 Task로 처리할 수 없는 Build 작업이 필요한 경우 간단하게 나만의 Type의 Task를 만들 수 있습니다. buildSrc
디렉토리나, Package Plugin
에 사용자 정의 Task를 배치하는 것이 가장 좋습니다.
Custom Task Action(핸들러 인터셉터와 비슷)
원한 다면, 특정 Build의 작업 처리 전후에 task를 추가할 수도 있습니다. (Task.doFirst(), Task.doLast())
추가속성(extra properties)
xplugins {
id 'java'
}
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "build@master.org"
}
---
gradle - q printProperties
결과 :
3.1.0.RELEASE
build
main
plugin
추가속성을 이용하면, 프로젝트 또는 Task에 고유한 properties를 추가하고, Task, 또는 기타 Build 로직에서 사용할 수 있습니다. ext를 이용해 지정하거나 ext{} 블록을 이용해서 여러 추가 속성을 추가할 수 있습니다.
Custom Conventions(사용자 지정 규칙)
규칙
은 build를 쉽고 간단하게 사용할 수 있도록 도와주는 것 입니다. 사용자는 규칙을 제공하는 고유한 플러그인을 작성할 수 있습니다.
2. Gradle Script 기초
2.1 Projects and Tasks
Projects
모든 Gradle Build
는 하나 이상의 Projects
로 구성되어 있습니다.Projects
가 의미하는 바는, Gradle을 통해 무엇을 하느냐에 따라 달라집니다. 예를들어, WebApp에서는 Project가 JAR
를 의미합니다. Projects
는 스테이징 또는 프로덕션 환경에 App을 배포하는 것
과 같은 수행할 작업을 나타낼 수도 있습니다. 즉, 반드시 Projects가 Build될 작업물을 의미하지는 않습니다.
Task
각각의 Projects는 하나 이상의 Tasks
로 구성됩니다. Tasks
는 build가 수행하는 일부 원자적 작업을 나타냅니다.
일부 클래스를 컴파일하거나, JAR를 생성하거나, Javadoc을 생성하는 등을 나타낼 수 있습니다.
2.2 Gradle Script의 Types
https://galid1.tistory.com/645?category=757944
Gradle Script
에는 크게 3가지 유형의 script가 존재합니다. Build, Init, Settings
가 바로 그것들인데요, 각각의 Script들이 어떤 일을 하는지는 위 주소에 자세히 설명 해놓았습니다.
https://docs.gradle.org/current/dsl/
Gradle Script(Build Script, Init Script, Settings Script)
가 실행될때는, 위 표와 같이 각 Gradle Script타입에 맞는 Delegate Instance를 구성하게됩니다.
예를들어 Build Script
가 실행될때에는, Project
를 구성하게 됩니다.
따라서, 각 Gradle Script는, 각각의 Delegate Instance의 properties, methods
를 사용할 수 있습니다.
또한, 모든 유형의 Gradle Script는 Script interface
(https://docs.gradle.org/current/dsl/org.gradle.api.Script.html)를 구현합니다. 따라서, Script Interface에서 제공하는 properties, methods
들도 Gradle Script에서 사용이 가능합니다.
2.3 Build 스크립트 작성 예제(kotlin)
gradle의 script를 kotlin으로도 작성을 할 수 있습니다. 마침 요즘 회사에서 Kotlin을 배우고 있는데, 이때문에 스크립트 작성을 Kotlin을 이용해 해보도록 하겠습니다.
간단한 스크립트
xxxxxxxxxx
tasks.register("hello") {
doLast {
println("hello")
}
}
build.gradle.kts
파일을 만들고 위와 같이 작성합니다.
xxxxxxxxxx
$ gradle -q hello
hello
그 후, sh을 이용해 gradle -q hello
를 실행합니다. (-q 옵션은 로그를 보여주지 않는 옵션으로 출력을 좀더 명확하게 볼 수 있도록 도와줍니다.)
작업간 종속성 스크립트
제목 그대로, task
간에 종속성
을 표시하여, 특정 task가 끝난뒤 task가 실행되도록 할 수 있습니다.
xxxxxxxxxx
tasks.register("hello") {
doLast {
println("hello")
}
}
tasks.register("intro") {
dependsOn("hello")
doLast {
println("I'm gradle")
}
}
build.gradle.kts
에 intro
task를 추가합니다. 중요한 점은 dependsOn("hello")
를 이용해, hello task
에 대한 의존성을 명시했다는 것 입니다. 사실 dependsOn은 의존성을 의미하기 때문에, doLast{}의 전이나 후 아무곳에서 실행하더라도 hello task를 먼저 실행하게 됩니다.
xxxxxxxxxx
tasks.register("intro") {
dependsOn("hello")
doLast {
println("I'm gradle")
}
}
tasks.register("hello") {
doLast {
println("hello")
}
}
또한 intro task
가 의존하는 hello task
가 intro task가 선언되기 이전에 선언되지 않더라도 상관이 없습니다.
xxxxxxxxxx
$ gradle -q intro
hello
I'm gradle
마찬가지로 sh에서 새로 추가한 intro task를 실행합니다. hello task가 실행된 다음 intro task가 실행된 것을 볼 수 있습니다.
동적 작업
gradle은 동적으로 task를 생성할 수도 있습니다.
xxxxxxxxxx
repeat(4) {
tasks.register("count$it") {
doLast {
println("hi ~ $it")
}
}
}
위와 같이 repeat을 이용해 수를 0부터 3까지 반복을 하며, 각 수를 이용해 count$it
task를 동적으로 생성합니다. 동적으로 생성된 각 task들은 hi ~ $it
을 출력합니다.
xxxxxxxxxx
$ gradle -q count1
hi ~ 1
위와 같이 동적으로 생성된 task를 실행할 수 있습니다.
3. 프로젝트 Build Script 작성해보기
3.1 Project API
Project API - https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#N14F33
라이브러리, 어플리케이션과 같이 build
대상이 되는 소프트웨어 구성요소에 gradle Project
를 매핑합니다. 각각의 Build Script는 Project
type 개체와 연결되어 있고, build script가 실행될때 이를 구성합니다.
xxxxxxxxxx
println(name)
println(project.name)
결과 :
"프로젝트 이름이 출력됩니다."
build.gradle.kts를 생성하고 위의 코드를 입력한뒤 sh에서 gradle -q check
를 실행합니다.
'Software Engineering > Build Tool' 카테고리의 다른 글
BuildTool - Gradle Script 파일과 Gradle 도메인 객체(Task 객체) (0) | 2019.10.07 |
---|---|
BuildTool - Groovy란? (Groovy 문법과, 초간단 build.gradle 작성 예제) (0) | 2019.10.06 |
BuildTool - Gradle 구성 파일 요약(init.gradle, settings.gradle, build.gradle) (0) | 2019.10.05 |
BuildTool - Build란? (0) | 2019.10.05 |
Gradle - Intellij Build sync fail (Invalid gradle JDK Configuration found) (0) | 2019.02.02 |