욱'S 노트

Gradle - Dependency Management Basics 본문

Programming/Gradle

Gradle - Dependency Management Basics

devsun 2015. 5. 4. 15:04

What is dependency management ?


매우 러프하게 디펜던시 관리는 두가지 요소를 가진다. 첫번째는 Gradle은 프로젝트를 빌드하고 실행하기 위해 필요한 것들에 대해서 알아야 한다. 이러한 것을 프로젝트의 incoming 파일들을 dependencies라고 부른다. 두번째로 당신의 프로젝트가 생성한 것들을 업로드할 필요가 있다. 이러한 outgoing 파일들을 publications라고 부른다. 두가지 요소를 더욱 자세히 살펴보자.


대부분의 프로젝트들은 자기 자신만으로 완성할 수 없다. 컴파일하고 테스트하기 위해서 다른 프로젝트들의 파일을 필요로 한다. 예를 들어 내 프로젝트에 Hibernate를 사용하기 위해 내 소스를 컴파일 하기 위해 Hibernate의 jar 파일들이 클래스패스내에 있어야 한다. 또한 테스트를 수행하기 위해 테스트 클래스 패스에 JDBC 드라이버 Ehcache등 다양한 jar들이 필요할 수 있다. 


이러한 incoming 파일들이 프로젝트의 디펜던시를 형성한다. Gradle은 이러한 디펜던시를 찾아내고 빌드에 적용하기 위한 다양한 방법을 지원한다. 디펜던시는 리모트 메이븐이나 아이비 리파지토리로 부터 다운로드 될 수 있고, 로컬 리파지토리에 위치 시킬 수 있으며, 같은 멀티 프로젝트 빌드의 또 다른 프로젝트에 의해 참조될 수 있을 것이다. 이러한 프로세스를 dependency resolution이라고 한다.


이러한 기능은 Ant에서는 제공하지 않는 것이다. Ant에서는 로딩할 특정한 jar의 패스를 지정해야 된다. Gradle에서는 디펜던시의 names을 단순히 정의함으로써 그들의 디펜던시를 적용할 수 있다. Apache Ivy를 적용한 Ant와 하지만 Gradle의 방식이 더 우수하다.


종종 프로젝트 디펜던시는 또한 디펜던시를 가질 수 있다. 예를 들어 Hibernate core는 실행하기 위해 또 다른 디펜던시를 가질 수 있다. 그래서 Gradle에서 프로젝트의 테스트를 수행하기 위해 이러한 디펜던시 또한 이용가능할 수 있어야 한다. 우리는 이러한 것을 transitive dependencies라고 부른다.


대부분의 프로젝트의 주요 목적은 프로젝트 외부에서 프로젝트를 사용하게 하는 것이다. 예를 들어 프로젝트가 자바 라이브러리로 생성된다면,  jar로 빌드될 것이고 source jar와 도큐먼트가 어딘가에 퍼블리시 되어야 할 것이다.


이러한 프로젝트를 outgoing 파일을 publication이라고 한다. Gradle 또한 이러한 작업을 중요하게 생각한다. 프로젝트에 publication을 정의할 수 있으며, Gradle은 프로젝트를 빌드하고 어떤 장소로 퍼블리시 할 것이다. 로컬 리파지토리로 파일을 카피할 수도 있고 리모트 메이븐이나 아이비 리파지토리로 업로드 할 수도 있다. 또한 다른 멀티 프로젝트 빌드에서 프로젝트의 파일을 사용할 수 도 있을 것이다. 이러한 과정을 publication이라고 한다.


Declaring your dependencies


디펜던시 정의를 살펴보자. 기본 빌드 스크립트는 다음과 같다.


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.+'
}


빌드 스크립트는 다음과 같이 정의되어 있다. 첫번째로 Hibernate core 3.6.7.Final을 프로덕션 코드 컴파일을 위해 사용한다. 암묵적으로 Hibernate core의 디펜던시들은 runtime시 필요하다. 빌드 스크립트는 또한 junit 4.0 이상의 버젼의 프로젝트 테스트 컴파일을 위해서 필요하다고 정의되어 있다. 또한 Gradle은 필요로하는 디펜던시를 찾기 위해 Maven central 리파지토리를 사용할 것이다. 


Dependency configurations


Gradle의 디펜던시들은 configurations로 그룹지어 진다. Configuration은 디펜던시의 명명된 세트이다. 그들을 dependency configurations라고 한다. 프로젝트의 외부 디펜던시 정의를 위해 사용될 수 있다. 이러한 내용은 다음에 살펴보겠다.


자바 플러그인은 많은 수의 표준 설정을 정의하고 있다.  이러한 설정들은 자바 플러그인을 사용할 경우 클래스패스에 나타나고 몇몇은 아래와 같으며 더 자세한 내요은 다음에 살펴 보겠다.


compile - 프로젝트의 프로덕션 코드를 컴파일하기 위해 필요한 디펜던시

runtime - 런타임시 프로덕션 클래스에 의해 필요한 디펜던시, 디폴트로 컴파일 타임 디펜던시에 포함한다.

testCompile - 테스트 소스를 컴파일하기 위해 필요한 디펜던시, 디폴트로  컴파일된 프로덕션 클래스들과 컴파일 타임 디펜던시를 포함한다.

testRuntime - 테스트를 실행하기 위해 필요한 디펀던시, 디폴트로 컴파일, 런타임, 테스트 컴파일 디펜던시를 포함한다.


External dependencies


다양한 타입의 디펜던시들을 정의할 수 있다. 하나의 타입이 external dependency이다. 이것은 외부로부터 빌드된 파일들에 대한 디펜던시이며, 메이븐 중앙 리파지토리, 회사의 메이븐 혹은 아이비 리파지토리 또는 로컬 파일 시스템 디렉토리일 수 있다. 


dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}


external 디펜던시를 정의하기 위한 dependency configuration은 다음과 같다. 리파지토리의 종류에 따란 group, version은 옵션일 수 있다.


외부 디펜던시를 지정하는 shortcut은 "group:name:version" 이다.


Repositories


어떻게 Gradle은 외부 디펜던시에 대한 파일을 찾을까? Gradle은 그들을 리파지토리부터 찾는다. 리파지토리는 group, name, version으로 이루어진 실제 파일의 집합이다. Gradle은 Maven, Ivy와 같은 몇몇의 다른 리파지토리를 적용할 수 있다. 또한 로컬 파일 시스템 및 HTTP를 사용해 리파지토리에 접근할 수 있다.


기본적으로 Gradle은 어떤 리파지토리도 정의하지 않고 있다. 외부 디펜던시를 사용하기 전에 적어도 하나를 정의를 해야한다. 하나의 옵션은 Maven 중앙 리파지토리를 사용하는 것이다.


repositories {
    mavenCentral()
}


또는 리모트 메이븐 리파지토리


repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}


또는 리모트 아이비 리파지토리


repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
    }
}


또는 로컬 아이비 리파지토리


repositories {
    ivy {
        // URL can refer to a local directory
        url "../local-repo"
    }
}


프로젝트는 또한 여러개의 리파지토리를 참조할 수도 있다. Gradle은 디펜던시를 찾기 위해 각 리파지토리를 명시된 순서대로 찾을 것이며 필요한 모듈을 찾으면 첨으로 발견된 리파지토리에서 탐색을 중지한다.


Publishing artifacts


디펜던시 설정은 또한 퍼블리시를 위해서도 이용된다. 퍼블리시되는 파일들을 publication artifacts 또는 일반적으로 artifacts라고 한다.


플러그인 프로젝트의 아티팩트를 정의하기에 유용한다. 그래서 퍼블리시를 위한 특별한 설정을 할 필요가 없다. 하지만 아티팩트를 퍼블리시 하기위한 장소를 지정할 필요가 있다. uploadArchives 타스크에 리파지토리를 추가함으로써 가능하다. 다음 예제는 퍼블리시를 위한 리모트 아이비 리파지토리를 설정한 예이다.


uploadArchives {
    repositories {
        ivy {
            credentials {
                username "username"
                password "pw"
            }
            url "http://repo.mycompany.com"
        }
    }
}


gradle uploadArchives 커맨드를 수행하면 Gradle은 빌드를 수행하고 jar를 업로들 할 것이다. Gradle은 또한 ivy.xml를 생성하고 업로드할 것이다.


또한 메이븐 리파지토리로 퍼블리시 할 수 있다. 문법은 약간 다르다. 메이븐 리파지토리로 퍼블리시를 수행할 것이며, Gradle pom.xml을 생성하여 업로드를 수행할 것이다.


apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
}


'Programming > Gradle' 카테고리의 다른 글

Gradle - Java Quick Start  (0) 2015.05.04
Gradle - 빌드 스크립트 기초  (0) 2015.05.04
Gradle - 설치하기  (0) 2015.05.04
Gradle - 소개  (0) 2015.04.02
Comments