진짜 개발자
본문 바로가기

Software Engineering/Build Tool

Build Tool - Gradle 개념 정리

728x90
Gradle의 중요 기능

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)

추가속성을 이용하면, 프로젝트 또는 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/

Type of scriptDelegates to instance of
Build scriptProject
Init scriptGradle
Settings scriptSettings

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을 이용해 해보도록 하겠습니다.

 

간단한 스크립트

build.gradle.kts파일을 만들고 위와 같이 작성합니다.

 

그 후, sh을 이용해 gradle -q hello를 실행합니다. (-q 옵션은 로그를 보여주지 않는 옵션으로 출력을 좀더 명확하게 볼 수 있도록 도와줍니다.)

 

작업간 종속성 스크립트

제목 그대로, task간에 종속성을 표시하여, 특정 task가 끝난뒤 task가 실행되도록 할 수 있습니다.

build.gradle.ktsintro task를 추가합니다. 중요한 점은 dependsOn("hello")를 이용해, hello task에 대한 의존성을 명시했다는 것 입니다. 사실 dependsOn은 의존성을 의미하기 때문에, doLast{}의 전이나 후 아무곳에서 실행하더라도 hello task를 먼저 실행하게 됩니다.

 

또한 intro task가 의존하는 hello task가 intro task가 선언되기 이전에 선언되지 않더라도 상관이 없습니다.

 

마찬가지로 sh에서 새로 추가한 intro task를 실행합니다. hello task가 실행된 다음 intro task가 실행된 것을 볼 수 있습니다.

 

동적 작업

gradle은 동적으로 task를 생성할 수도 있습니다.

 

위와 같이 repeat을 이용해 수를 0부터 3까지 반복을 하며, 각 수를 이용해 count$it task를 동적으로 생성합니다. 동적으로 생성된 각 task들은 hi ~ $it을 출력합니다.

 

위와 같이 동적으로 생성된 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가 실행될때 이를 구성합니다.

 

build.gradle.kts를 생성하고 위의 코드를 입력한뒤 sh에서 gradle -q check를 실행합니다.