Gradle - Gradle의 기본

2019. 10. 20. 19:41Web/Gradle

 

이번 포스팅은 Gradle에 대한 기본을 다루어볼 것이다. 사실 Gradle이 뭔지 모르는 개발자는 거의 없을 것임으로, 자세한 설명은 하지 않을 것이다. Gradle은 빌드툴이다! (마치 Maven과 같은)

 

Gradle 내부 프로젝트 인터페이스

Project

>final DEFAULT_BUILD_FILE

>DEFAULT_BUILD_DIR_NAME

>GRADLE_PROPERTIES

>SYSTEM_PROP_PREFIX

>Task task(String name, Closure configureClosure)

 

프로젝트 인터페이스는 그래들로 프로젝트를 설정하고 구성할 때 사용하는 파일로, 그래들 프로젝트를 논리적으로 표현하는 인터페이스이다. default_build_file 파일은 프로젝트 설정에 대한 정보를 담고 있으며, 값은 build.gradle로 정의되어 있다. 그래서 build.gradle 파일에서 빌드에 필요한 기본 설정을 하게 된다. default_build_dir_name은 빌드한 결과물(ex. jar,war..)이 저장되는 디렉토리이다. Maven에서는 target 디렉토리에 저장되는데, 그래들에서는 build 디렉토리에 저장된다. gradle_properties는 그래들에서 key/value 형태로 사용할 수 있는 프로퍼티파일에 대한 속성으로 그래들이 초기화되면 build.gradle 파일과 함께 생성되고 속성을 정의해서 사용할 수 있다. 프로퍼티 파일을 사용할 때 접두어가 SYSTEM_PROP인 이유는 SystemPropertiesHandler에서 프로퍼티 파일을 읽을 때 다른 속성값들과 구분하기 위해 SystemProp\\.(.*)")와 같은 형태를 사용하기 때문이다.

 

그래들 Task 인터페이스

Task

>TASK_NAME

>TASK_TYPE

>TASK_EDPENES_ON

>TASK_ACTION

>getProject(), getDependencies()

 

프로젝트는 Task 인터페이스를 가지고 있어서 Task는 프로젝트를 기준으로 실행된다. Task를 실행할 때 Task 인터페이스에서는 기본적으로 Task의 이름과 Task의 유형, Task의 의존성 여부, Task 액션 등을 속성으로 가지고 있다. 즉, Task 인터페이스를 Action을 가지고 있는 것이다.

 

Gradle Build Lifecycle

그래들은 크게 세 단계의 빌드 라이프 사이클을 가진다.

 

1)초기화(init)

그래들이 초기화될 때 settings.gradle과 build.gradle 파일의 상호작용을 통해서 build.gradle에 있는 프로젝트의 정보를 수집한다. settings.gradle 파일의 정보로 해당 프로젝트를 싱글 프로젝트로 구성할 것인지 멀티 프로젝트로 구성할 것인지 등을 결정하고 프로젝트의 인스턴스를 생성한다. 현재 작업 중인 루트 디렉토리에 settings.gradle 파일이 없으면 상위 디렉토리에 settings.gradle파일이 있는지 확인하고, 상위 디렉토리에도 존재하지 않는다면 해당 프로젝트를 싱글 프로젝트로 인식한다.

 

2)설정

프로젝트 인스턴스화가 끝나면 설정 정보가 프로젝트에 반영되는 단계이다.

 

3)실행

그래들은 이전 단계에서 구성된 Task의 부분집합을 이름으로 구분하고, 그 이름이 Gradle 명령에 전달되어 실행된다.

 

Gradle 설치

Mac OS 기준으로 설치가 진행되었음을 알려드립니다.

 

>brew install gradle

 

설치 끝!

 

빌드 초기화

그래들에는 빌드 초기화를 지원하는 명령이 있다. 또한 init 명령은 다섯 가지 타입을 지원한다.

 

  1. Basic
  2. Groovy-library
  3. Java-library
  4. Pom
  5. Scala-library

 

간단하게 Basic 타입으로 Gradle 프로젝트를 초기화해본다.

 

>gradle init --type basic

>Select build script DSL:

  1: Groovy

  2: Kotlin

>Enter selection (default: Groovy) [1..2] 1

>Project name(default:..) gradleBasic> gradle init --type basic

Select build script DSL:

  1: Groovy

  2: Kotlin

Enter selection (default: Groovy) [1..2] 1

Project name (default: gradleExam): gradleBasic

> Task :init

Get more help with your project: https://guides.gradle.org/creating-new-gradle-builds

BUILD SUCCESSFUL in 16s

2 actionable tasks: 2 executed

 

그래들 초기화가 완료되었다. 생성된 디렉토리를 살펴보면, 아래와 같은 파일들이 존재한다.

 

  1. build.gradle
  2. gradle
  3. gradlew
  4. gradlew.bat
  5. settings.gradle

대부분 설명한 파일들이며 추후에 자세히 다루어볼 것이고, 설명하지 않은 gradlew,gradlew.bat, gradle 디렉토리가 있을 것이다. 우선 gradlew는 그래들을 설치하지 않아도 사용할 수 있게하는 Wrapping된 명령이다. gradle 디렉토리에 들어가면 Wrapper를 이용하여 그래들을 사용할 수 있게 하는 파일들이 존재한다. 다음은 자바 프로젝트로 초기화하는 그래들 초기화 명령이다.

 

> gradle init --type java-library

 

Select build script DSL:

  1: Groovy

  2: Kotlin

Enter selection (default: Groovy) [1..2] 1

Select test framework:

  1: JUnit 4

  2: TestNG

  3: Spock

  4: JUnit Jupiter

Enter selection (default: JUnit 4) [1..4] 1

Project name (default: gradle): gradleJava

Source package (default: gradleJava): com.java.gradle

> Task :init

Get more help with your project: https://docs.gradle.org/5.6.3/userguide/java_library_plugin.html

BUILD SUCCESSFUL in 18s

2 actionable tasks: 2 executed

 

생성된 build.gradle을 살펴보자.

 

 

간단히 설정을 설명하자면, 그래들은 외부 저장소를 설정할 수 있다. 일반적으로 url로 다운로드 경로를 적지만, 위와 같이 jcenter() 혹은 mavenCentral() 메서드로 대체할 수 있다. 라이브러리를 사용할 때는 dependencies 블록 안에 라이브러리 그룹명과 패키지명, 버전을 

"그룹:라이브러리:버전" 형식으로 입력한다.

 

사용자 정의 Task 만들기

이번에는 init 명령으로 생성한 build.gradle 파일을 편집해서 그래들 Task를 만든다. 다음은 "Gradle Hello"을 출력하는 Task이다.

 

task hello {

        println 'Gradle Hello'

}

 

그래들에서 Task를 만들 때는 'task Task명'을 입력한다. 스크립트를 사용할 때 'function 함수명'을 입력하는 것과 유사하다. Task를 만들면 Task 목록에 등록되며 gradle tasks명령으로 확인할 수 있다. 사용자가 정의한 Task는 Other tasks에 표시된다. task를 실행해보자.

 

>gradle hello

 

> Configure project :

Gradle Hello

BUILD SUCCESSFUL in 588ms

 

실행 결과에는 println 메서드로 출력한 문자열이 표시된다.

 

Task 실행 순서 제어하기

 

task cellphone{

        description = 'Display calling message'

        doLast{

                println '통화하기'

        }

        doFirst{

                println '전화걸기'

        }

        doLast{

                println '전화끊기'

        }

}

 

> gradle cellphone

 

> Task :cellphone

전화걸기

통화하기

전화끊기

 

결과를 보면 doFirst 태스크가 먼저 실행된 것을 볼 수 있다. 나머지는 정의된 순서대로 수행되었다. 이렇게 선행관계를 줄 수도 있다. 다음은 디폴트 Task를 지정하는 방법이다.

 

디폴트 Task 지정

그래들에서는 기본으로 실행해야 하는 Task를 디폴트로 지정할 수 있다. 지금까지는 그래들을 실행할 때 'cellphone'과 같은 Task의 이름을 파라미터로 지정하였지만, Task를 디폴트로 지정하면 'gradle'만 입력해도 실행할 수 있다.

 

defaultTasks 'defaultTask'

 

task defaultTask{

        println 'Default Task Run !'

}

 

> gradle cellphone

> Configure project :

Default Task Run !

> Task :cellphone

전화걸기

통화하기

전화끊기

BUILD SUCCESSFUL in 721ms

1 actionable task: 1 executed

=========================

> gradle

> Configure project :

Default Task Run !

BUILD SUCCESSFUL in 537ms

 

특정 태스트를 실행하던, 특정 태스크 이름을 넘기지 않아도 디폴트 Task는 항상 실행되는 것을 볼 수 있다.

 

Task 의존성 설정

Task가 실행될 때 다른 Task도 함께 실행하려면 'depends On'으로 의존관계를 설정하면 된다.

 

task cellphone(dependsOn:'dependTask'){

        description = 'Display calling message'

        doLast{

                println '통화하기'

        }

        doFirst{

                println '전화걸기'

        }

        doLast{

                println '전화끊기'

        }

}

task dependTask{

        println 'Depends On Task'

}

 

여기까지 간단하게 그래들 초기화방법과 태스크를 정의해 실행해보았다. 다음 포스팅은 자바 프로젝트에 초점에 맞춰 더 다양하게 그래들 예제를 다루어볼 것이다.