티스토리 뷰




[Gradle UserGuide 도전기] 8. Dependency Management Basics


  8.1 What is dependency management?


대략 dependency management는 2가지로 이루어져 있다. 첫째로, 그래들(Gradle)은 당신의 프로젝트가 빌드되거나 실행되는데 필요한 것들을 (그래들이 그것들을 찾아야 하기 때문에) 알아야 한다. 우리는 이러한 incoming files를 프로젝트의 dependencies라고 부른다. 둘째로, 그래들은 당신의 프로젝트가 생성하는 것들의 빌드와 업로드가 필요하다. 우리는 이러한 outgoing files를 프로젝트의 publications라고 부른다. 이제 이러한 2가지 요소에 대해서 자세하게 알아보자.


대부분의 프로젝트는 완벽하게 독립적으로 존재하지 않는다. 보통은 컴파일, 테스트 등을 하기 위해서 다른 프로젝트에서 빌드된 파일이 필요하다. 예를 들어 내 프로젝트에서 Hibernate를 사용하기 위해서는, 소스를 컴파일 할 때 클래스패스(class path)에 Hibernate jars를 포함시켜야 한다. 또한 테스트를 실행하기 위해서는 JDBC driver나 Ehcache jars같은 추가적인 파일을 테스트 클래스패스에 포함시켜야 한다.


이러한 incoming files이 프로젝트의 dependencies를 나타낸다. 그래들은 당신이 당신의 프로젝트의 dependencies가 무엇인지 말할 수 있도록 한다. 그렇게 함으로서, 이러한 dependencies를 검색하거나 빌드에서 사용할 수 있게 한다. 이러한 dependencies는 remote Maven or Ivy repository에서 다운로드 되거나, 로컬 디렉토리에 위치시키거나, (같은 멀티 프로젝트 내에서 빌드된)다른 프로젝트가 빌드하는 등의 방법이 필요하다. 우리는 이러한 과정을 dependency resolution이라고 부른다.


기억할 점은 그래들이 이러한 특성 때문에 Ant보다 더 큰 이점으로 작용한다는 것이다. Ant에서는 오직 (jars를 로드하기 위한)특정한 절대 혹은 상대경로를 설정하는 기능만이 존재한다. 그래들은 간단하게 당신이 dependencies의 "names"를 선언하면, 다른 layers가 이러한 dependencies가 어디서 오는지 결정한다. Ant에서도 Apache Ivy를 추가 함으로서 비슷하게 할 수 있지만, 그래들이 더 좋다.


종종 프로젝트의 dependencies는 그들 스스로 dependencies를 갖는다. 예를들어 Hibernate core는 실행될 때 클래스패스에 몇가지 다른 라이브러리가 요구된다. 그러므로, 그래들이 당신의 프로젝트 테스트를 실행 할 때, 그래들은 이들 dependencies를 찾고 available한 상태로 만들어야 한다. 우리는 이것을 transitive dependencies라고 한다.(당신이 지정한 dependency가 다른 dependency를 필요로 할 때 그래들은 자동으로 그 dependency까지 프로젝트에 추가해준다. 이러한 특징 때문에 transitive한(우리말로 적당한 말을 못 찾겠네요.... transit이 전이하다 라는 뜻에 기인해서 해석하면 좋을 것 같습니다. 어떠한 특성이 다른 대상에게 까지 전이되는 느낌?) dependecies라고 보면 될 것 같습니다.)


대다수 프로젝트의 주요 목적은 외부 프로젝트에 쓰일 몇 가지 파일을 빌드하는 것이다. 예를들어 만약 당신의 프로젝트가 자바 라이브러리를 생성하면, jar파일을 어쩌면 source jar나 어떤 documentation를 빌드하고 이들을 어딘가로 publish한다.


이러한 outgoing files가 프로젝트의 publications을 나타낸다. 그래들은 이러한 중요한 과정을 도와줄 수 있다. 당신이 당신의 프로젝트의 publications를 선언하면 그래들은 이들을 빌드하고 어딘가로 publishing 한다. 정확히는 publishing의 의미는 당신이 무엇을 원하는지에 달렸다. 당신은 어쩌면 파일을 로컬 디렉토리에 복사하하거나 remote Maven or Ivy repository에 업로드 되길 원할 수 있다. 또는 이 파일들을 (같은 멀티 프로젝트 빌드 상의) 다른 프로젝트에서 사용하고 싶을 수도 있다. 우리는 이러한 행동을 publication이라고 한다.


  8.2 Declaring your dependencies


몇가지 dependency의 선언을 보자. 다음은 기초적인 build script이다.



이 build script는 프로젝트에 대한 몇 가지를 서술한다. 먼저, hibernate core 3.6.7.Final이 당신의 소스가 컴파일 되는데 필요하다는 점을 명시한다. 함축적으로, 하이버네이트 코어와 그 dependencies 또한 런타임 시에 필요하게 된다. build script는 또한, junit 중 4.0이상이 프로젝트의 테스트를 컴파일 하는데 필요하다고 명시한다. 그리고 Gradle이 이러한 dependencies를 Maven central repository에서 찾도록 말해준다. 다음 섹션에서 더 자세히 알아보도록 하자.


  8.3 Dependency configurations


Gradle에서 dependencies는 configurations에 그룹화 되어 있다. configuration은 간단하게 dependencies에 이름을 붙인 세트(named set)이다. 우리는 그러한 세트를 dependency configurations라고 여긴다. 당신은 이것들을 당신의 프로젝트의 외부 dependencies를 선언하기 위해 사용할 수 있다. 다음에 살펴보겟지만, 이것뿐만 아니라 이것들은 프로젝트의 publications를 선언하기 위해 사용되기도 한다.


java plugin은 몇가지의 표준 configurations를 정의한다. 이러한 configurations는 java plugin이 사용하는 클래스패스를 나탄낸다. 몇 가지는 밑을 참고하라. 그리고 더 세세한 부분은 나중에 23챕터의 표 23.5(Java plugin-dependency configurations)를 참조하여라.


compile : 당신의 프로젝트의 소스를 compile하는데 필요한 dependencies를 의미함


runtime : runtime시에 필요한 dependencies. 기본적으로 compile dependencies를 포함함. 


testCompile : test source를 compile하는데 필요한 dependencies를 의미함. 기본적으로 compile된 클래스와 complie시 필요한 dependencies를 포함함.


testRuntime : test를 할 때 필요한 dependencies를 의미함. 기본적으로 compile, runtime, test compile시 필요한 dependencies를 포함함.


다양한 플러그인들이 표준 configuration에 추가된다. 당신은 당신만의 커스텀 configurations를 당신의 빌드에 사용할 수 잇다. 51.3 챕터를 보면, Dependency가 있다. 여기서 당신은 dependency configurations를 정의하는 방법과 커스터마이징 하는 방법을 디테일하게 볼 수 있다.


  8.4 External dependencies


당신이 선언할 수 있는 dependencies에는 여러가지 type이 있다. 그 중 하나가 바로 external dependency이다. 이것은 현재 빌드의 밖에 빌드된 어떤 파일(Maven central이나 Ivy와 같은 어떤 종류의 repository에 저장된)의 dependency이다. external dependency를 정의하기 위해서, 당신은 다음을 dependency configuration에 추가해야 한다.



external dependency는 group, name, version의 값으로 식별된다. 당신이 사용하는 repository가 무엇이냐에 따라 group과 version은 달라진다.

(Depending on which kind of repository you are using, group and version may be optional.라고 적혀있는데 version도 달라지나? 좀 의아하네요. 어차피 외부 의존성은 보통 http://mvnrepository.com/ 같은데서 검색해서 경로를 알아내니 크게 고심 할 필요는 없을 것 같습니다.)


위와 같은 설정을 "group:name:version" 형태로 짧게 할 수도 있습니다. 이는 다음과 같습니다.



더 많은 dependecies에 대한 정보를 원하시면 51.4 챕터 How to declare your dependencies를 살펴 보십시오.


  8.5 Repositories


Gradle은 어떻게 external dependencies를 찾아낼까요? Gradle은 이것들을 repository에서 찾아냅니다. repository란 사실 group과 name, version으로 이루어진 파일들의 모임입니다. Gradle은 몇가지 다른 repository 형식(Maven과 Ivy와 같은)을 알고 있습니다. 그리고 이에 대해 접근하는 방법들(local file system이나 HTTP등)을 알고 있습니다.


기본적으로 Gradle은 아무 repository도 정의하지 않습니다. 당신은 external dependencies를 정의하기 위해 최소한 하나의 repository를 정의해줘야 합니다. 그 중 하나가 Maven cetral repository를 정의하는 것입니다.



아니면 remote Maven repository를 정의해도 됩니다.


아니면 remote Ivy repository.


local file system을 repository로 설정 할 수도 있습니다.


프로젝트는 여러개의 repositories를 가질 수도 있습니다. Gradle은 각각의 명시된 repository에서 dependency를 찾아나가다가, 요청된 모듈이 있는 첫 repository에서 멈춥니다.


repositories에 대해서 더 알고 싶으시면 51.6 챕터 Repositories를 찾아 보십시오.


  8.6 Publishing artifacts


Dependency configurations는 파일들을 publish하는데도 쓰인다. 우리는 이러한 파일들을 publication artfacts라고 부른다.(보통 그냥 artifacts라고도 부른다.)


Plugin들은 artifacts들을 정의하는데 꽤 많은 일들을 이미 포함하고 있다. 그러니 당신은 굳이 많은 걸 Gradle에게 말해줄 필요가 없다. 그러나 당신은 Gradle에게 artifacts를 어디에 publish할지 정도는 말해줘야 한다. 당신은 uploadArchives task에 repositories를 첨부함으로서 이를 해결할 수 있다. 다음은 remote Ivy repository에 publishing을 하는 예이다.



이제, 당신이 gradle uploadArchives 명령을 실행 할 때, Gradle은 프로젝트를 build하고 당신의 jar파일로 upload 할 것이다. Gradle은 또한 ivy.xml을 생성할 뿐만 아니라 upload까지 할 것이다.


당신은 Maven repositories에도 publish할 수 있습니다. 문법은 약간 달라집니다. 우선 주의할 점은 이 경우 maven plugin을 apply하셔야 합니다. 다음과 같이 수행할 경우 pom.xml이 생성되고 업로드 될 것입니다.


더 자세한 이야기는 52챕터 Publishing artifacts를 참조하십시오.


  8.7 Where to next?


모든 dependency resolution에 대한 자세한 내용은 51챕터, Dependency Management, and for artifact publication과 52챕터, Publishing artifacts를 보십시오.


만약 당신이 여기서 언급된 DSL elements에 흥미가 있다면, Project.configurations{}, Project.repositories{}, Project.Dependencies{}를 보십시오.




아 이번 장은 영어가 많네요. 그만큼 글이 더 길어진 한 챕터였습니다.


모 말은 많아지만 결국 이번 챕터는 프로젝트에 필요한 파일을 어떻게 선언하고, 프로젝트로 생성된 파일을 어디로 내보낼지 설정해주는게 포인트 같네요.


그리 어려운 내용은 아니지만 Gradle과 같은 빌드 툴을 사용하는 핵심적인 요소이니 잘 살펴보시기 바랍니다.
























댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함