2016년 3월 23일 수요일

Dependency Management Basics

What is dependency management?

간단히 얘기해서, dependency management는 두 개로 나누어져 있다. 가장 먼저, Gradle은 당신의 프로젝트가 build 혹은 run을 할 때 찾기 위해 알아야 하는 것이 있는데,
우리는 이 것을 프로젝트의 dependencies 라고 부른다. 두번째로, Gradle은 빌드를 하고, 빌드를 하는 동안 생긴 것을 upload 해야할 필요가 있다. 우리는 이것을 publications라고 부른다.
이 두 개의 세부사항에 대해 알아보자.

대부분의 프로젝트는 완전히 자신만을 포함하고 있지는 않다. compile , test 등등을 위해 다른 프로젝트에 의해 build된 파일들을 필요로 한다. 예를 들면, 내 프로젝트에서 hibernate를 사용하기 위해서
compile할 때 몇몇의 Hiberate jar 파일을 classpath 아래에 포함시켜야 한다. test를 실행시키기 위해서는, JDBC driver 나 EHcache jar 파일 같은 몇몇의 추가적인 jar를 test classpath에 추가시켜야 한다.

Gradle은 당신의 프로젝트에서 필요한 이러한 dependency를 찾고, build에 사용할 수 있는 form을 제공한다. 이러한 dependency들은 원격 Maven 이나 Ivy repository 혹은 local repository에서 다운로드 받아야 할 수도 있고,
같은 multi-project build안에서 build 되어야 할 수도 있다. 우리는 이것을 dependency resolution이라고 부른다.

이 feature는 Ant 위에서 중대한 장점을 제공한다. Ant에서는 당신은 load할 jar의 절대적인, 혹은 상대적인 경로를 명시할 수 있다.
Gradle에서는 단지 당신의 dependency의 "이름"만 간단히 선언해주고, 다른 layer에서 그 dependency가 어디서 오는 지 결정한다.

종종 dependency들은 그 스스로 다른 dependency를 포함한다. 예를 들어 Hibernate core는 몇몇의 다른 라이브러리를 요구한다.
그래서 이러한 경우에 Gradle은 당신의 project의 test를 실행할 때, 이러한 dependency들을 찾을 필요가 있고 그것들을 사용 가능하게 한다.
우리는 이것을 transitive dependencies 라고 부른다.

대부분의 프로젝트에서 중요한 목적은 밖에서 쓰일 파일들을 만드는 build 작업이다. 예를 들어 당신의 프로젝트가 java library를 만든다면,
당신은 jar를 빌드하여야한고, 어딘가에 publish하여야 한다.

당신은 당신의 프로젝트의 publication을 선언하고, Gradle은 그것들을 build하고, 어딘가에 publish 한다.
당신은 아마도 이 파일들을 local directory에 복사하거나, remote Maven 혹은 Ivy repository에 업로드하는 것을 원할 것이다.
우리는 이것을 publication이라고 부른다.

Declaring your dependencies

dependency 선언

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

위 스크립트는 몇가지 것을 얘기하고 있다.
처음으로, Hibernate3.6.7.Final 이 프로젝트를 compile하기 위해서 필요하다. 암묵적으로, HIbernate core와 이것의 dependencies 또한 runtime에 필요할 것이다.
빌드 스크립트는 junit 4 버전 대도 프로젝트의 테스트를 compile하기 위해 필요하다는 것을 명시하고 있다.
그리고 Gradle이 Maven central repository 에서 찾아보는 것을 얘기하고 있다.


Dependency configurations

Gradle에서, dependencies는 configurations 안으로 그룹지어진다. configuration은 간단히 dependencies의 set로 이름지어진다. 우리는 이것을 dependency configurations라고 명명할 것이다.
당신은 이것을 외부의 dependencies를 선언하는데 사용할 수 있다. 이후에 볼 것 처럼, 그것들은 당신의 프로젝트의 publicatioins를 선언하는데에도 사용된다.

Java plugin 은 많은 standard configurations를 정의한다. 이러한 configurations는 java plugin이 사용되는 classpaths를 얘기한다. 몇몇 개는 아래에 listing 되어 있다.


compile
프로젝트의 production source를 compile할 때 필요한 dependencies

runtime
runtime때 production classes에 의해 요구되는 dependencies. 기본적으로 compile time dependencies를 포함한다.

testCompile
프로젝트의 test source를 compile할때 요구되는 dependencies. 기본적으로 compiled production classes 와 compile time dependencies를 포함한다.

testRuntime
test를 run할 때 필요한 dependencies. 기본적으로 compile, runtime 과 test compile dependencies를 포함한다.

External dependencies

당신이 선언할 수 있는 여러가지 dependency들이 있다. 그중에 하나가 external dependency이다. 이 것은 현재 build의 바깥에 있는 빌드된,
Maven central 혹은 corporate Maven 혹은 Ivy repository 혹은 local system의 directory 등의 repository에 저장되어 있는 파일이다.

external dependecy를 선언하기 위해, dependency configuration에 아래와 같이 추가하면 된다.

build.gradle

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

external dependency는 group, name, version 특성을 이용해 구분된다. 당신이 사용하는 repository에 따라, group과 version은 선택적이 될 수 있다.
external dependency를 선언하기 위한 shortcut은 아래와 같다.

build.gradle

dependencies {
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
}


Repositories

Gradle은 어떻게 external dependencies를 찾을까? Gradle은 repository에서 그것들을 찾는다. repository는 단지 group, name, version으로 구성되어 있는 file의 저장공간이다.
Gradle은 Maven, Ivy 등의 서로 다른 repository format을 알고 있고, local file system이나 HTTP 등의 repository에 접근하는 서로 다른 방법을 알고 있다.

기본적으로, Gradle은 어떠한 repository도 정의해놓지않는다. 당신은 external dependencies를 사용하기 전에 최소한 하나의 repository를 선언하여야 한다.
그 중 하나의 옵션은 Maven central 이다.

build.gradle

repositories {
    mavenCentral()
}

혹은 remote Maven repository

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

혹은 Ivy repository :

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

또한 local repository를 사용할 수도 있다.

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

하나의 프로젝트는 여러가지 repository를 가질 수 있다. Gradle은 명시된 순서대로 repository에서 dependency를 찾을 것이고, 처음 찾는 순간 그 것을 가져온다.

Publishing artifacts

Dependency configurations는 파일을 publish할 때도 사용이 된다. 우리는 이것을 publication artifacts 혹은 단순히 artifacts 라고 부른다.

plugin은 artifact를 정의하기에 무척이나 잘하고 있어서, 당신은 특별히 다른 것이 필요없다.
하지만, artifact를 어디에 publish 할 것인지 정해주어야한다. 이 것은 uploadArchives task를 통해서 할 수 있다.

Publishing to an Ivy repository

build.gradle

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

이렇게 하면, 당신이 gradle uploadArchives 태스크를 run 시키면, Gradle은 build를 하고 당신의 Jar를 업로드할 것이다.
또한, ivy.xml 을 만들고 이 것 또한 업로드한다.

당신은 Maven repositories에도 publish 할 수 있다. Maven repository에 업로드하기 위해서는 Maven plugin을 적용해야한다는 것을 잊지말자.
이 때에 Gradle은 pom.xml 을 생성하고 업로드한다.

Publishing to a Maven repository

build.gradle

apply plugin: 'maven'

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


원본 출처 : https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html

댓글 없음 :

댓글 쓰기