프로그래밍 공부/Gradle

Gradle 의존관계 관리, 환경구성 정의, 저장소 정의

Wonuk 2021. 9. 8. 01:04
반응형
Gradle의 모든 포스팅은 유튜브 프리렉을 기반으로 작성되었습니다.



링크 : https://www.youtube.com/watch?v=s-XZ5B15ZJ0&list=PL7mmuO705dG2pdxCYCCJeAgOeuQN1seZz

 

강의의 버전이 옛버전 이기 때문에 이론적인 부분만 학습하는것이 좋습니다.


의존관계 관리

 

 

의존 관계 관리 참조 사이트

https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html

 

Managing Dependencies of JVM Projects

How does Gradle know where to find the files for external dependencies? Gradle looks for them in a repository. A repository is a collection of modules, organized by group, name and version. Gradle understands different repository types, such as Maven and I

docs.gradle.org

 

 

의존 관계 관리 목적

목적 설명
의존 관계 해결 자동화 설정 지정을 통하여 특정 위치에서 필요한 라이브러리를 내려받거나 복사하여 추가
전이적 의존 관계 관리 외부의 라이브러리나 프로젝트 등이 추가로 다른 외부의 라이브러리나
프로젝트가 필요한지를 파악하거나 관리
의존 관계 표시 프로젝트가 특정 외부 라이브러리의 어떤 버전에 의존하는지 여부 표시

 

 

의존 관계 관리

// build를 위한 환경 구성/환경 설정
configurations {
	conf1 
}

// 의존관계 정의
dependencies {
	conf1 gradleApi() // 의존관계 지정
}

task exeTask << {
	// 설정된 환경 구성을 사용
    configurations.conf1.each{
		println it.absolutePath
	}
}

임의의 프로젝트 생성 후 build.gradle 파일에 해당 소스코드를 입력

 

 

gradle exeTask 실행결과

>Task :exeTask

C:\Users\hwu\.gradle\caches\7.0\generated-gradle-jars\gradle-api-7.0.jar

C:\Gradle\gradle-7.0\lib\groovy-all-2.4.11.jar

C:\Gradle\gradle-7.0\lib\gradle-installation-beacon-7.0.jar

 

해당 프로젝트가 참조하고 있는 라이브러리에 대한 정보들이 출력되는것을 확인 가능

 

 

 

 

순서

 

 

 

 

의존관계 지정 방법

지정 방법 설명
외부 모듈 의존 관계 지정 인터넷 저장소에 대하여 의존 관계 지정(저장소 정의 필요)
파일 의존 관계 지정 파일 시스템의 파일에 대하여 의존 관계 지정
프로젝트 의존 관계 지정 특정 프로젝트에서 다른 프로젝트에 대하여 의존 관계 지정
Gradle API 의존 관계 지정 사용중인 API가 포함된 라이브러리 파일에 대하여 의존 관계 지정
로컬 그루비 의존 관계 지정 현재 사용 중인 그루비에 대하여 내장된 라이브러리를 의존 관계 지정

 

 

 

일반적인 형식 (외부모듈 지정 방식)

'그룹명', '모듈명', '버전 번호'

dependencies {
	conf1 'ch.qos.logback:logback-classic:1.0.13'
    // 환경구성 그룹명:모듈명:버전정보 
	conf1 'org.springframework:spring-orm:4.0.2.RELEASE'
	conf1 (group: 'org.gradle.api.plugins', name: 'gradle-cargo-plugin', version:'0.6.1')
}   // group:'', name: '', version: ''

 

 

임의의 프로젝트 생성 후

// 환경구성 정의
configurations {
	conf1
}

// 저장소 정의
repositories {
	mavenCentral()
}

// 의존관계 정의
dependencies {
	// 외부 모듈 의존 지정
	conf1 'ch.qos.logback:logback-classic:1.0.13'
	conf1 'org.springframework:spring-orm:4.0.2.RELEASE'
	conf1(group:'org.gradle.api.plugins',name:'gradle-cargo-plugin',version:'0.6.1')
}

task exeTask <<{
	configurations.conf1.each{
		println it.absolutePath
	}
}

 

 

gradle exeTask 실행결과

> exeTask

참조하고 있는 라이브러리 경로들이 출력

 

 


 

파일의 의존관계

 

특정 라이브러리나 파일을 지정하여 의존관계 정의

// 환경구성 정의
configurations {
	conf1
}

// 의존관계 정의
dependencies {
	//1. 파일 의존관계 - 특정 파일이나 라이브러리 지정
	conf1 files("lib/commonLib.jar")
	//2. 파일 의존관계 - 디렉터리 지정
	conf1 fileTree(dir:"lib", include:"**/*.jar")
}

task exeTask <<{
	configurations.conf1.each{
		println it.absolutePath
	}
}

 

 

 

특정 프로젝트에서 다른 프로젝트를 참조하는 경우

project API이용하여 지정하고자 하는 프로젝트를 콜론 ( : ) 을 이용하여 계층적으로 구분하여 사용

// 환경구성 정의
configurations {
	conf1
}

// 의존관계 정의
dependencies {
	// project 의존관계
	compile project(':subProject')
	conf1 'ch.qos.logback:logback-classic:1.0.13'
}

task exeTask <<{
	configurations.conf1.each{
		println it.absolutePath
	}
}

멀티 프로젝트에서 root프로젝트를 기준으로 sub프로젝트를 지정하고자 할때 사용한 예

 

 

 

 

gralde API를 이용한 의존관계 설정

관련 메소드를 환경 설정을 위한 변수에 정의하여 사용하면 된다.

관련 API가 지정한다고 무조건 의존관계를 정의할 수 있는것은 아니다.

 

// 환경구성 정의
configurations {
	conf1
}

// 의존관계 정의
repositories {
	mavenCentral()
}

apply plugin: 'groovy'

dependencies{
    // gradle api 의존관계
    conf1 gradleApi()
    
    // local groovy 의존관계
    conf1 localGroovy()
}

task exeTask <<{
	configurations.conf1.each{
		println it.absolutePath
	}
}

local groovy를 사용하기 위해서는 apply plugin:'groovy'를 이용하여 지정해야한다. 그 후 의존관계 지정 가능

 

실행결과를 확인해보면 gradleApi뿐만 아니라 localGroovy에 대해서도 의존관계가 형성되어 있다.

 

 

 

 

시간이 경과함에 따라 프로젝트에서 의존관계를 형성하고 있는 라이브러리의 버전이

새롭게 출시, 변경될 경우 라이브러리의 버전을 동적으로 관리하는 방법

전체 스크립트 코드는 생략

(생략)
// 변경성 모듈에 대한 캐시 간격 지정
// 시간간격을 통해서 환경설정 부분을 제어
configurations.confDef.resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes'
configurations.confDef.resolutionStrategy.cacheChangingModulesFor 10, 'hours'

(생략)
// 의존관계 정의
dependencies {
    // 버전 중 최신 버전에 대한 지정
    confDef 'org.slf4j:slf4j-api:1.+' // 현재 1.이라고 시작하는 최신버전을 사용하겠다 라는 의미
    // 출시 버전 중 최신 버전에 대한 지정
    confDef 'commons-cli:commons-cli:latest.integration'
    // 배포된 버전 중 최신 버전에 대한 지정
    confDef 'junit:junit:latest.release' 
}
(생략)

 

 

 

 

해당 라이브러리 버전간의 충돌이 발생할 때

라이브러리의 파일들이 복합적으로 구성된 구성들 사이에서 동일한 라이브러리로 인한 버전 충돌이 발생할 수 있다

예) jdk버전과의 충돌

 

gradle에서는 이러한 문제를 방지하기 위해서 같은 종류의 라이브러리가 있을 때

가장 최신 버전에대한 라이브러리를 참조하도록 의존관계가 관리되고있다.

 

 

버전이 충돌할 경우 해결방법 2가지

방법 설명
Newest 정책 버전이 충돌할 경우 최신 버전을 사용
Fail 정책 버전이 충돌할 경우 오류를 발생시켜 빌드가 실패하도록 함

 

 

 

Fail 정책

// 환경구성 정의
configurations {
    confDef
    // 환경구성 상속
    newConfDef.extendsFrom confDef
}

configurations.newConfDef{
    resolutionStrategy{
    	failOnVersionConflict() // 예외처리
    }
}

resolutionStrategy 블록을 지정하여 예외처리

 

 

exclude 키워드를 이용해서 해당 모듈을 직접적으로 제외

dependencies{
...(생략)...
    testConf1(group: 'org.spockframework', name:'spock-core', version:'0.7-Groovy-2.0'){
    	exclude module:'Groovy-all'
    }
}

 

 

특정 버전을 사용할 수 있도록 지정

 

Fail정책 사용 시 특정 버전을 사용할 수 있도록 강제적 지정

force API 이용

// Fail 정책 사용
configurations.testConf1 {
    resolutionStrategy{
        failOnVersionConflict()
        // 버전 사용 강제적 지정 부분
        force 'org.codehaus.Groovy:Groovy-all:2.3.1'
    }
}

 

 

 


환경 구성 정의

 

configurations 블록

환경 구성이 정의가 되어 환경구성 간에 상속을 이루어서 사용 가능

repositories {
    jcenter() // https://jcenter.bintray.com/
}

configurations {
    conf1
    testConf1.extendsFrom conf1
}

dependencies {
    conf1 group:'org.codehaus.groovy', name:'groovy-all',version:'2.3.1'
    testConf1 group:'junit', name:'junit', version:'4.11'
}

task exeTask <<{
    configurations.testConf1.each{
        println it.absolutePath
    }
}

 

 

gradle exeTask실행결과

Conf1에 지정되어 있던 환경구성 정보가

testConf1에 extendsFrom이란 키워드를 통해서 환경구성 정보가 상속되어 그정보가 출력됨

 

 

 


저장소 정의

 

저장소는 repositories 블록으로 정의한다

 

저장소

gradle은 maven저장소를 사용할 수 있으며 maven 저장소를 이용하여 저장소를 정의 가능

gradle에서는 maven저장소를 비롯하여 id저장소나 maven local저장소 등등의 저장소를 사용할 수 있다

 

 

 

maven 저장소

오픈소스 라이브러리나 maven plugin, maven 아키타입을 관리하는 저장소로

최상위 저장소로 말할 수 있다. 그래서 개발자가 라이브러리를 임의로 배포할 수 없는 특징을 가진 저장소이다.

 

maven 아키타입이란?

maven에서 나만의 템플릿 또는 보일러 플레이트를 제작하는 방법이다.

자주 사용하는 코드를 나만의 것으로 만드는것

// 메이븐 저장소
repositories {
	mavenCentral()
}

// 메이븐 저장소 URL
repositories{
    maven{
        url"http://repo1.maven.org/maven2"
    }
}

 

 

 

메이븐 로컬 저장소

중앙 저장소나 원격 저장소에서 다운받은 파일들을 저장하고 관리하는 역할을 한다.

// 메이븐 로컬 저장소
repositories {
	mavenLocal()
}

=>USER_HOME/.m2/repository // 경로

 

 

 

Jcenter 메이븐 저장소

빈트레이에서 제공하는 저장소를 사용하는 것으로서 원격저장소로 볼 수 있다.

단체나 사내등의 할당받은 공간에서 라이브러리 파일들을 배포하거나 저장하고 관리할 수 있는 저장소

repositories{
	jcenter()
}

 

 

 

 

gradle에서는 maven 저장소 뿐만 아니라

ivy 저장소를 사용할 수 있는데 사용방법은 메이븐 저장소와 비슷하다.

IVY 저장소 사용

// IVY 저장소
repositories{
    ivy{
    	url"http://"
        layout"maven" // 메이븐과 같은 저장소 디렉터리 구조 지정
    }
}

 

 

 

로컬 디렉터리 저장소 사용

// 로컬 디렉터리 저장소 사용
repositories{
    flatDir{
        dirs"local_lib","introHtml" // 로컬 디렉터리 지정
    }
}

 

 

 

반응형