What is Gradle?


개요

Gradle빌드 자동화 도구 오픈소스로써, 다양한 타입의 소프트웨어를 빌드할 수 있게끔 설계되었다. 아래는 큰 그림에서 Gradle의 중요한 요소들에 대한 설명이다.


고성능

Gradle은 불필요한 작업들은 배제하고 입/출력이 변경(결과물에 대한 변경으로 봐도 될듯)tasks에 대해서만 실행한다. 또한 build cache를 사용함으로써 이전 task 실행의 결과물을 그대로 활용할 수 있다.


JVM 기반

GradleJVM 위에서 실행되기 때문에 JDK가 필수이다. 그리고 JVM 위에서 작동한다는 특징은 Java 플랫폼에 익숙한 개발자들에게 좋은 옵션인데, Build Logic에 있어 custom task 내에서 표준 자바 API를 활용할 수 있다.


Conventions

GradleBuild-By-Convention이다. 즉, 컨벤션에 따른 빌드를 수행한다.

이를테면 java plugin의 경우

  • 소스코드는 src/main/java
  • 테스트는 src/main/test
  • 리소스는 src/main/resources
  • 빌드결과는 build/libs

와 같은 기본적인 규약이 존재하고, 이는 사용자 요구에 따라 변경이 가능하다.

GradleMaven으로 부터 의존 라이브러리 관리 기능을 차용했다. 따라서 컨벤션을 따라 Java 프로젝트와 같은 일반 유형의 프로젝트를 쉽게 빌드할 수 있다.

적절한 Plugins를 적용한다면 짧은 build script를 가지고도 프로젝트를 구성할 수 있다.

그리고 필요하다면 컨벤션을 오버라이딩하거나 task를 추가하면서 컨벤션 기반의 빌드를 커스터마이징 할 수 있다.


확장성

쉽게 Gradle을 확장하여 task를 제공하거나 어떤 모델을 build할 수 있다.


Gradle 사용자를 위한 반드시 알아야 할 다섯가지

Gradle은 아주 강력하고 유연한 빌드 도구로써 입문자도 쉽게 시작할 수 있다. 하지만 아래 5가지의 핵심 원칙들을 숙지하면 더욱 접근하기 쉽고 강력하게 사용할 수 있다.


Gradle is a general-purpose build tool

Gradle은 범용 빌드 툴이다. Gradle은 어떤 소프트웨어건 빌드할 수 있는데, 빌드하려는 대상이나 작업 수행 방법에 대해 가정을 하지 않기 때문(빌드 수행을 위한 별다른 제약 사항이 없다.)이다.

단, 한 가지 주의해야할 제약사항이 있는데, Dependency ManagementMaven 또는 Ivy 호환 저장소 (mavenCenteral, jcenter)파일 시스템(로컬 디렉토리가 가능)만 지원한다는 것

이러한 범용성build를 위해 많은 작업이 필요 없다는 것을 의미한다.

다시말해, Gradleplugin을 통해 사전에 빌드된 기능컨벤션 계층을 추가함으로써 일반 타입의 프로젝트(Java 라이브러리 등)을 쉽게 build할 수 있다.

또한 커스텀 플러그인을 개발하고 배포함으로써 컨벤션빌드 세부사항을 캡슐화 할 수 있다.


The core model is based on tasks

core modeltasks 기반이다.

Gradle은 작업 단위의 tasks들로 DAGs를 모델링한다. 이 말은 build를 위해서는 여러 task들로 연결된 하나의 집합(종속성 기반)을 설정함으로써 DAG를 생성한다는 것을 의미한다.

task graph가 만들어지면, Gradletask들이 일련의 순서와 과정에 따라 실행되도록 한다.

위 그림처럼 build processtasks graph로 모델링 된다. 그리고 이는 Gradle이 유연성을 갖게 한다.

또한 task graphplugins와 사용자의 build scripttasks들을 task dependency mechanism을 통해 연결 가능하다.

task dependency mechanism이란

https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:task_dependencies

Task는 아래 3 가지 요소로 구성된다.

  • Actions : 파일을 복사하거나 소스를 컴파일 하는 등의 행동들
  • Inputs : Actions에서 사용하는 변수 또는 값, 파일, 디렉토리 등
  • Outputs : Actions가 생성하거나 변경하는 파일 또는 디렉토리들


Gradle has several fixed build phases

Gradlebuild를 위해 고정된 몇 단계의 작업이 필요하다.

Gradlebuild script 실행을 위해 총 3 단계의 phases를 이해하는 것이 중요하다.

  1. Initialization(초기화)
    • build를 위한 환경을 설정하고 어떤 프로젝트들이 build에 포함될 것인지 결정
  2. Configuration(설정)
    • build에 대한 task graph를 구성 및 설정하고 사용자가 실행하려는 task들을 어떤 순서로 실행하고 또 필요한 다른 task들은 어떤 것이 있는지 결정
  3. Excecution(실행)
    • Configuration 단계에서 선택된 tasks들을 실행한다.


Gradle is extensible in more ways than one

Gradle은 여러가지 방법으로 확장 가능하다.

Gradle은 확장을 위한 다양한 메커니즘을 제공한다.

  • Custom task types
    • 기본적으로 제공되는 task에 원하는 기능이 없을 시 커스텀 task type을 사용할 수 있다. 가장 좋은 방법은 custom task를 위한 source filebuildSrc 디렉토리(자바 프로젝트)에 넣거나 패키징된 플러그인에 넣는 것이다.
  • Custom task actions
    • custom build logic을 어떤 task 실행 전/후로 삽입할 수 있다.
      • 전 : Task.doFirst()
      • 후 : Task.doLast()
  • Extra properties on projects and tasks
    • custom actions나 다른 build logic에서 사용할 수 있도록 task 또는 project에 대한 별도의 properties를 추가할 수 있다.
    • Extra Properties는 단순히 사용자가 생성한 custom tasks 뿐만 아니라 Gradle core plugins에도 적용할 수 있다.
  • Custom convestions
    • Conventionsbuild를 단순화 함으로써 사용자들이 좀 더 쉽게 사용할 수 있도록 하는 강력한 방법이다. 사용자는 Custom Plugin을 작성하고 해당 플러그인에 Conventions를 정의할 수 있다. 단, convention에 따른 실행을 위한 default value를 구성해야 한다.


Build scripts operate against an API

API 기반의 build scripts 작동

API 기반으로 작동하기 때문에 build script 기술 시, how 가 아니라 what을 표현하는게 좋다.


참고