본문 바로가기

DevOps/Project management

Gradle build tool 4.0 가이드

About Gradle - Gradle Doc

We would like to introduce Gradle to you, a build system that we think is a quantum leap for build technology in the Java (JVM) world. Gradle provides:


  • Ant처럼 유연하고 관용적이며 확장성 있는 build tool
  • 타 빌드프로그램으로 수운 변경
  • 강력한 multi 프로젝트 빌드
  • 강력한 dependency management
  • Maven 혹은 Ivy repository 사용가능
  • Groovy(그루비 위키피디아) build script

Gradle command-line - Gradle Doc
커맨드라인을 사용한 gradle사용법을 알아보자

Executing multiple tasks
gradle에서는 command-line을 통해 single build에 필요한 multiple task들을 한번에 execute가능하다. 예를들어 gradle compile test 명령어는 gradle에서 compile task과 tast task를 실행한다. Gradle에서 명령어를 입력하게 되면 task들을 순서대로 실행하게 된다. 그리고 각 task에 걸려있는 dependency들도 당연히 실행한다. 각 task들은 무조건 한번씩만 실행한다.

Example
예를 들어 gradle에 아래와 같이 4개의 task들이 선언되어 있다고 가정하자. dist task와 test task는 각각 compile task에 종속되어 있다. 이때 gradle dist test 를 실행하게 되면 아래와 같이 결과가 나오게 된다.

그림. 각 task에 대한 dependency관계도


build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
task compile {
    doLast {
        println 'compiling source'
    }
}
 
task compileTest(dependsOn: compile) {
    doLast {
        println 'compiling unit tests'
    }
}
 
task test(dependsOn: [compile, compileTest]) {
    doLast {
        println 'running unit tests'
    }
}
 
task dist(dependsOn: [compile, test]) {
    doLast {
        println 'building the distribution'
    }
}
cs


결과물

위 그림에서 보는 것 처럼 각 task는 단 한번만 실행되었다. 

(만약에 gradle task task 로 명령어를 실행하더라도 gradle task 와 똑같은 명령이 실행되게 된다.)


Executing multiple tasks
특정 task들을 제외하고 실행하려면 아래와 같이 수행가능하다.



Task name abbreviation
task들은 full name으로 실행이 가능하지만 해당 task를 구별 할수있을 만큼 충분한 길이의 task이름을 명령어로 친다면 해당 task는 아래 그림과 같이 동일하게 수행되게 된다.
(gradle compTestgradle cT 와 똑같은 실행을 한다.)


Dependency Management Basics - Gradle Doc
Gradle의 dependency 관리에 대해 알아보자

What is dependency management?
크게봐서 dependency management는 두가지로 나뉘어져 있다.
  1. Gradle은 프로젝트를 빌드하거나 run할때 필요한 것들이 있음
  2. Gradle은 프로젝트를 만들때 빌드하거나 upload해야 하는 것들이 있음
많은 프로젝트들은 다른 프로젝트의 컴파일이나 테스트가 선행되어야 하는 관계가 많다. 예를 들어 간단한 웹프로젝트를 한다고 가정하면 컴파일타임때  classpath에 Hibernate jar들이 include되야한다.
이와 같이 추가되는 파일들을 dependencies라고 볼 수 있다. Dependencies는 Maven이나 Ivy repository 의 다운로드 파일들 혹은 local directory 혹은 같은 프로젝트에 있는 다른모듈이 필요 할 수도 있다. 이러한 프로세스를 dependency resolution 이라고 부른다.
그리고 우리 프로젝트에서 필요한 Hibernate jar은 또 다른 library를 다시 필요로 할수 있다 이것을 transitive dependencies 라고 부른다.
프로젝트는 compile하거나 run함으로 끝나는 것이 아니라 특정 디렉토리로 jar파일을 만들어 보내거나 remote repository로 보내는 역할도 필요로 한데 이것들을 publication 이라고 부른다.

Declaring your dependencies
가장 기본적인 gradle의 dependencies 구조는 아래와 같음.

build.gradle
1
2
3
4
5
6
7
8
9
10
apply plugin: 'java'
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}
cs

위 build 스크립트에서 몇가지 정보를 알 수 있다.

  1. 프로젝트를 compile하기 위해서는 Hibernate core 3.6.7.Final 이 필요함
  2. 또한 Hibernate core은 runtime에서 필요함
  3. 프로젝트를 test compile하기 위해서는 junit >= 4.0 이 필요함
  4. 이 프로젝트는 필요한 dependencies를  Maven central repository로 부터 받고있음

Dependency configurations
Gradle dependencies는 configurations 그룹으로 이루어져 있다.
Configuration은 dependencies의 이름으로 이루어져 있다. 이것을 우리는 dependency configurations 라고 부른다.
각 configurations에 대해 설명하자면

  1. Compile : 프로젝트를 compile할 때 필요한 디펜던시들
  2. runtime : 프로젝트의 runtime 때 필요한 디펜던시들(compile 때도 자동 포함됨)
  3. testCompile : 프로젝트를 test compile할 때 필요한 디펜던시들(compile 때도 자동 포함됨)
  4. testRuntime : 프로젝트를 test run할 때 필요한 디펜던시들(compile, runtime, test compile 때도 자동 포함됨)
그 외에도 추가적인 configuration들이 plugin에 의해 추가 될 수도 있다.

External dependencies
프로젝트에 필요한 외부 dependency들을 선언할 수 있는데 이것을 external dependency라고 부른다. 아래와 같이 두가지 방법으로 똑같은 dependency를 선언가능하다.

build.gradle
1
2
3
dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}
cs

build.gradle
1
2
3
dependencies {
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
}
cs


Repositories - Gradle Doc
Gradle은 외부 dependency를 외부 영역에서 찾는데 그것을 repository라고 부른다. Repository는 파일, 그룹, 이름, 버젼의 모음이다. Gradle은 Maven과 Ivy와 같이 준비된 repository를 사용할 수도 잇고, 혹은 사용자가 직접 설정한 repository를 참조하여 dependency를 가져올 수 있다. 
Gradle은 default설정으로 repository를 선언하지 않으므로 사용자는 반드시 하나이상의 repository를 설정해야 한다.

build.gradle - Maven Central repository 사용하는 경우
1
2
3
repositories {
    mavenCentral()
}
cs

build.gradle - JCenter repository 사용하는 경우
1
2
3
repositories {
    jcenter()
}
cs

build.gradle - remote Maven repository 사용하는 경우
1
2
3
4
5
repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}
cs


Publishing artifacts
Dependency configuration들은 publish file들을 사용한다. 이 파일들을 publication artifacts 혹은 artifacts 라고 부른다. 만약 Maven repositroy로 publish한다면 아래와 같이 선언하여 사용 가능하다.
build.gradle
1
2
3
4
5
6
7
8
9
apply plugin: 'maven'
 
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
}
cs



End of Document