Apache Ivy에 기반한 Gradle repository management는 당신에게 repository layout과 검색 정책에 대한 자유를 준다.
추가적으로 Gradle은 미리 설정된 repository를 추가할 수 있는 편리한 method를 제공한다.
당신은 각각이 Gradle에 의해 독립적으로 관리되는 어떠한 갯수의 repository도 설정할 수 있다.
만약 Gradle이 특정한 repository에서 module descriptor를 찾게 되면, 같은 repository로부터 모든 artifact를 다운로드받기위해 시도할 것이다.
module meta-data와 artifact는 반드시 같은 repository에 위치해 있어야 하지만, 하나의 repository이지만 여러개의 URL로 jar와 meta-data를 찾는 것 역시 가능하다.
아래에 당신이 선언할 수 있는 몇개의 repositories가 있다.
- Repository types
Maven central repository
Maven Central 안에 있는 dependency를 찾기 위해 미리 설정되어 있는 repository.
Maven JCenter repository
Bintray's JCenter 안에 있는 dependency를 찾기 위해 미리 설정되어 있는 repository.
Maven local repository
local Maven repository 안에 있는 dependency를 찾기 위해 미리 설정되어 있는 repository.
Maven repository
Maven repository이며 local filesystem 혹은 remote location에 위치해 있을 수 있다.
Ivy repository
Ivy repository이며 local filesystem 혹은 remote location에 위치해 있을 수 있다.
Flat directory repository
local filesystem에 있는 간단한 repository. 어떠한 meta-data format도 지원하지 않는다.
Maven central repository
central Maven 2 repository (http://repo1.maven.org/maven2) 를 추가하기 위해 간단히 아래와 같이 build script에 추가하면 된다.
ex) Adding central Maven repository
build.gradle
repositories { mavenCentral() }
이제 Gradle은 이 repository 안에서 당신의 dependencies를 찾을 것이다.
주의 :
central Maven 2 repository 는 오직 HTTP만 사용하고, HTTPS는 지원하지않는다.
만약 당신이 public HTTPS 를 가능하게 하는 repository가 필요하다면, 당신은 JCenter public repository를 사용할 수 있다.
Maven JCenter repository
Bintray's JCenter는 모든 유명한 Maven OSS artifact 중에서 가장 최신의 collection이다.
JCenter Maven repository (https://jcenter.bintray.com) 를 추가하기 위해서 간단히 아래와 같이 당신의 build script에 추가하면 된다.
ex) Adding Bintray's JCenter Maven repository
build.gradle
repositories { jcenter() }
이제 Gradle은 JCenter repository 안에 있는 당신의 dependencies를 찾을 것이다.
jcenter()는 repository에 연결하기 위해 HTTPS를 사용한다.
HTTP를 사용하기 위해서 jcenter()를 설정할 수도 있다.
ex) Using Bintrays's JCenter with HTTP
build.gradle
repositories { jcenter { url "http://jcenter.bintray.com/" } }
Local Maven repository
local Maven cache를 repository로 사용하기 위해서 아래와 같이 할 수 있다.
ex) Adding the local Maven cache as a repository
build.gradle
repositories { mavenLocal() }
Gradle은 당신의 Maven cache의 위치를 찾기위해 Maven과 같은 logic을 사용한다.
만약 local repository 위치가 settings.xml에 정의되어 있다면, 그 위치는 사용될 것이다.
USER_HOME/.m2settings.xml 은 M2_HOME/conf/settings.xml 보다 우선순위를 갖는다.
만약 가능한 settings.xml 이 없다면, Gradle은 기본 위치로써 USER_HOME/.m2/repository를 찾을 것이다.
Maven repositories
custom된 Maven repository를 추가하기 위해서 아래와 같이 할 수 있다.
ex) Adding custom Maven repository
build.gradle
repositories { maven { url "http://repo.mycompany.com/maven2" } }
때때로 POMs 는 어떤 한 위치에서 가져오고, JAR나 artifact는 다른 곳에서 가져와야하는 경우가 있다.
그런 경우에 아래와 같이 사용할 수 있다.
ex) Adding additional Maven repositories for JAR files
build.gradle
repositories { maven { // Look for POMs and artifacts, such as JARs, here url "http://repo2.mycompany.com/maven2" // Look for artifacts here if not found at the above location artifactUrls "http://repo.mycompany.com/jars" artifactUrls "http://repo.mycompany.com/jars2" } }
Gradle은 가장 처음 POM과 JAR를 찾기위해 처음 URL을 찾게 된다.
만약 JAR를 거기서 찾을 수 없음변, artifact URL은 JAR를 찾기 위해 사용된다.
Accessing password protected Maven repositories
basic authentication을 사용하는 Maven repository에 접근하기 위해, 당신은 아래와 같이 repository를 정의할 때 username과 password를 명시할 수 있다.
ex) Accessing password protected Maven repository
build.gradle
repositories { maven { credentials { username 'user' password 'password' } url "http://repo.mycompany.com/maven2" } }
username과 password는 build file보다 gradle.properties 에 보관하는 것을 추천한다.
Flat directory repository
만약 당신이 filesystem directory를 repostory로 사용하길 원한다면, 아래와 같이 쓸 수 있다.
ex) Flat repository resolver
build.gradle
repositories { flatDir { dirs 'lib' } flatDir { dirs 'lib1', 'lib2' } }
이 것은 dependencies를 찾기 위해 하나 혹은 그 이상의 directory를 repository로써 추가한다.
명심해야 할 것은 이러한 종류의 repository는 Ivy XML 혹은 Maven POM files 같은 meta-data format을 지원하지않는다는 것이다.
Gradle은 artifact가 존재함에 따라, 동적으로 module descriptor를 생성한다.
하지만, Gradle은 descriptor를 생성하는 것보다 기존에 생성되어 있는 것을 사용하는 것을 선호한다.
flat directory repository는 remote location에 존재하는 meta-data를 가지고 있는 artifact를 override하는 데에 사용될 수 없다.
예를 들어, 만약 Gradle이 jmxri-1.2.1.jar를 flat repository 안에서 찾았고, jmxri-1.2.1.pom을 다른 repository에서 찾았다면,
Gradle은 pom 파일을 찾은 repository를 module을 제공하는데에 사용할 것이라는 것이다.
Ivy repositories
Defining an Ivy repository with a standard layout
ex) Ivy repository
build.gradle
repositories { ivy { url "http://repo.mycompany.com/repo" } }
Defining a named layout for an Ivy repository
당신은 당신의 repository가 Ivy 혹은 Maven default layout를 따르게 하기 위해 named layout을 사용할 수 있다.
ex) Ivy repository with named layout
build.gradle
repositories { ivy { url "http://repo.mycompany.com/repo" layout "maven" } }
유효한 named layout은 'gradle' (the default), 'maven', 'ivy' 그리고 'pattern'이다.
Defining custom pattern layout for an Ivy repository
정형화된 layout을 사용하지않기위해, 당신은 'parttern' layout을 사용할 수 있다.
ex) Ivy repository with pattern layout
build.gradle
repositories { ivy { url "http://repo.mycompany.com/repo" layout "pattern", { artifact "[module]/[revision]/[type]/[artifact].[ext]" } } }
선택적으로, pattern layout을 사용하는 repository는 각각의 조직 부분을 나누는 '점'을 '/' 로 교체할 수 있다.
에를 들어, my.company 는 my/company 로 표현될 수 있다.
ex) Ivy repository with Maven compatible layout
build.gradle
repositories { ivy { url "http://repo.mycompany.com/repo" layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" m2compatible = true } } }
Accessing password protected Ivy repositories
basic authentication을 사용하는 Ivy repository에 접근하기 위해서, 당신은 username과 password를 명시할 수 있다.
ex) Ivy repository
build.gradle
repositories { ivy { url 'http://repo.mycompany.com' credentials { username 'user' password 'password' } } }
Supported repository transport protocols
Maven과 Ivy repository는 다양한 종류의 전송 protocol 사용을 지원한다.
지금 현재 아래와 같은 protocol이 지원된다.
- Repository transport protocols
file : none
http : username / password
https : username / password
sftp : username / password
s3 : access key/secret key
repository를 정의하기 위해서, repositories configuration block을 사용할 수 있다.
repositories closure 안에서, Maven repository는 maven으로 선언된다.
또한 Ivy repository는 ivy로 선언된다.
전송 프로토콜은 repository의 URL 정의의 한 부분이다.
아래 build script는 어떻게 HTTP 기반의 Maven과 Ivy repository를 만드는지 보여준다.
ex) Declaring a Maven and Ivy repository
build.gradle
repositories { maven { url "http://repo.mycompany.com/maven2" } ivy { url "http://repo.mycompany.com/repo" } }
만약 repository에 인증이 필요하다면, 관련된 credential은 제공될 수 있다.
아래 예제는 SFTP repository를 위해 어떻게 username과 password가 제공되는지 보여준다.
ex) Providing credentials to a Maven and Ivy repository
build.gradle
repositories { maven { url "sftp://repo.mycompany.com:22/maven2" credentials { username 'user' password 'password' } } ivy { url "sftp://repo.mycompany.com:22/repo" credentials { username 'user' password 'password' } } }
AWS S3 기반의 repository를 사용할 때, 당신은 AwsCredentials가 필요할 것이다.
아래 예제는 어떻게 S3 기반 repository를 선언하고 AWS credential을 제공하는 지 보여준다.
ex) Declaring a S3 backed Maven and Ivy repository
build.gradle
repositories { maven { url "s3://myCompanyBucket/maven2" credentials(AwsCredentials) { accessKey "someKey" secretKey "someSecret" } } ivy { url "s3://myCompanyBucket/ivyrepo" credentials(AwsCredentials) { accessKey "someKey" secretKey "someSecret" } } }
S3 configuration properties
아래 system properties 는 s3 repositories와 통신하는 것을 설정하는 데에 사용될 수 있다.
- Configuration Properties
org.gradle.s3.endpoint
Used to override the AWS S3 endpoint when using a non AWS, S3 API compatible, storage service.
AWS가 아닌, S3 API를 사용할 수 있는 storage service를 사용할 때, AWS S3 endpoint를 override 하기위해 사용된다.
org.gradle.s3.maxErrorRetry
S3 서버가 HTTP 5xx status code를 보냈을 때, 재시도하는 최대 횟수. 명시되어 있지않을 때에는 3이 기본값으로 사용된다.
S3 URL formats
S3 URL은 virtual-host-style 이면서 반드시 s3://
e.g. s3://myBucket.s3.eu-central-1.amazonaws.com/maven/release
- myBucket은 AWS S3 bucket name.
- s3.eu-central-1.amazonaws.com 는 선택적인 region specific endpoint.
- /maven/release 는 AWS S3 key (해당 object가 어느 bucket에 있는지 알 수 있는 고유한 구분자)
S3 proxy settings
S3를 위한 proxy는 아래와 같은 system properties를 사용해 설정될 수 있다.
- https.proxyHost
- https.proxyPort
- https.proxyUser
- https.proxyPassword
- https.nonProxyHosts
만약 'org.gradle.s3.endpoint'가 http로 명시된다면, 아래 proxy setting이 사용될 수 있다.
- http.proxyHost
- http.proxyPort
- http.proxyUser
- http.proxyPassword
- http.nonProxyHosts
AWS S3 V4 Signatures (AWS4-HMAC-SHA256)
몇몇 AWS S3 regions에서 모든 HTTP request는 AWS's signature version 4에 따라 서명이 필요한 경우가 있다.
V4 signature가 필요한 bucket을 사용할 때에는 region specific endpoint를 포함하는 S3 URL을 명시하는 것이 권장된다.
e.g. s3://somebucket.s3.eu-central-1.amazonaws.com/maven/release
Configuring HTTP authentication schemes
HTTP 혹은 HTTPS 전송 프로토콜을 사용하는 repository를 설정할 때, 여러 개의 authentication scheme이 사용 가능하다.
기본적으로, Gradle은 Apache HttpCilent library에 의해 지원되는 모든 scheme을 사용하려고 할 것이다.
몇몇 케이스에서, 원격 서버에 credential을 교환할 때 어떠한 authentication scheme을 사용할 것인지 명시하는 것이 선호된다.
명시적으로 선언되었을 때, 원격 repository와 인증할때 오직 그 scheme만이 사용된다.
아래 예제는 오직 digest authentication을 사용하는 repository를 설정하는 것을 보여준다.
ex) Configure repository to use only digest authentication
build.gradle
repositories { maven { url 'https://repo.mycompany.com/maven2' credentials { username 'user' password 'password' } authentication { digest(DigestAuthentication) } } }
현재 지원되는 authenticatio scheme은 아래와 같다.
- Authentication schemes
BasicAuthentication
Basic access authentication over HTTP. When using this scheme, credentials are sent preemptively.
HTTP 상의 Basic access authentication.
이 scheme을 사용할 때, credential이 먼저 보내진다.
DigestAuthentication
HTTP 상의 Digest access authentication.
Using preemptive authentication
Gradle의 기본 행동은 서버가 HTTP 401 code를 보냈을 때 credential을 제출하는 것이다.
몇몇 케이스에서, 서버는 401이 아닌 다른 코드를 보내는 경우가 있고 이것은 dependency resolution을 실패하게 한다.
이러한 것을 피하기 위해서, credential을 서버로 먼저 보낼 수 있다.
이 것을 강능하게 하기 위해 BasicAuthentication scheme을 간단히 명시할 수 있다.
ex) Configure repository to use preemptive authentication
build.gradle
repositories { maven { url 'https://repo.mycompany.com/maven2' credentials { username 'user' password 'password' } authentication { basic(BasicAuthentication) } } }
Working with repositories
repository에 접근하기 위해서 :
ex) Accessing a repository
build.gradle
println repositories.localRepository.name println repositories['localRepository'].name
repository를 구성하기 위해서 :
ex) Configuration of a repository
build.gradle
repositories { flatDir { name 'localRepository' } } repositories { localRepository { dirs 'lib' } } repositories.localRepository { dirs 'lib' }
More about Ivy resolvers
Gradle은 repository에 관해서는 극도로 유연하다:
- repository와 통신하기 위한 protocol을 위한 많은 옵션이 있다. (e.g. filesystem, http, ssh, sftp ...)
- sftp protocol은 현재 오직 username/password-based authentication만 지원한다.
- 각각의 repository는 각각의 layout을 가질 수 있다.
// Maven2 layout (if a repository is marked as Maven2 compatible, the organization (group) is split into subfolders according to the dots.) someroot/[organisation]/[module]/[revision]/[module]-[revision].[ext] // Typical layout for an Ivy repository (the organization is not split into subfolder) someroot/[organisation]/[module]/[revision]/[type]s/[artifact].[ext] // Simple layout (the organization is not used, no nested folders.) someroot/[artifact]-[revision].[ext]
어떠한 종류의 repository를 추가하기 위해 당신은 아래와 같이 할 수 있다.
ex) Definition of a custom repository
build.gradle
repositories { ivy { ivyPattern "$projectDir/repo/[organisation]/[module]-ivy-[revision].xml" artifactPattern "$projectDir/repo/[organisation]/[module]-[revision](-[classifier]).[ext]" } }
원본 출처 : https://docs.gradle.org/current/userguide/dependency_management.html
댓글 없음 :
댓글 쓰기