프로그래밍 공부/Gradle

Gradle의 도메인 객체 Project, Task, Gradle, Settings, 기타

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



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

 

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

 


1. Project 객체

 

  • Project 객체 : 프로젝트의 환경 구성, 의존관계, 태스크 등의 내용을 제어 및 참조
  • build.gradle 과 대응
  • Project 객체의 생명주기

       - 빌드 수행을 위한 Settings 객체 생성

       - settings.gradle 스크립트 파일이 있을 경우 Settings 객체 비교

       - 구성된 Settings 객체를 이용하여 Project 객체의 계층 구조 생성

       - 멀티 프로젝트일 경우 부모 프로젝트부터 Project 객체 생성 후 자식 프로젝트의 Project 객체 생성

 

 

Project 객체 구조

TaskContainer는 프로젝트 정보를 참조하여 사용할 수 있도록 하는 기능을 제공한다.

ConfigurationContainer는 포로젝트의 구성을 관리할 수 있도록 기능을 제공

DependencyHandler는 의존관계를 관리할 수 있도록 기능을 제공

ArtifactHandler는 프로젝트의 결과물을 관리할 수 있도록 기능을 제공

RepositoryHandler는 프로젝트으 저장공간을 관리할 수 있도록 기능을 제공

 

이러한 Project객체가 여러 구성요소들의 기능을 위임받거나 생성해서 사용되어지고 제공하고있다.

 

 

Project 객체의 속성

속성 설명
version 프로젝트나 결과물의 버전(설정 없을 시 unspecified)
description 프로젝트 설명
name 프로젝트의 이름, 명칭
state 프로젝트 빌드 상태(프로젝트 상태의 종류: NOT EXECUTED, EXECUTING, EXECUTED, FAILED)
status 프로젝트 결과물의 상태(프로젝트 결과물 상태의 종류: NOT EXECUTED, EXECUTING, EXECUTED, FAILED)
path 프로젝트 경로(경로 구분자 ':')

 

 

Project 객체의 API

API 설명
Project(path) 지정된 경로의 프로젝트에 대하여 설정(상대 경로로 지정가능)
project(path, configureClosure) 지정된 경로의 프로젝트에 대하여 클로저를 사용하여 프로젝트 구성(상대 경로로 지정가능)
absoluteProjectPath(path) 절대 경로 변환하여 프로젝트 확인
apply(closure) 플러그인이나 스크립트를 적용
configure(object, configureClosure) 클로저를 통하여 설정된 상태를 이용하여 객체를 구성
subprojects(action) 해당 프로젝트의 하위 프로젝트 설정
task(name) 주어진 이름으로 태스크를 생성하고 프로젝트에 추가
afterEvaluate(action) 프로젝트가 평가된 직후 추가
beforeEvaluate(action) 프로젝트가 평가되기 바로 직전 추가

 

 

 

Project 객체의 실습

build.gradle

defaultTasks = ['exeTask001', 'exeTask002']

allprojects{
	project ->
		  project.beforeEvaluate{
			println project.name + ' : check strat'
      		  }
     	 	  project.afterEvaluate{
			println project.name + ' : check end'
      		  }
}

project.description = 'Project Object Description'
project.version = 'exeTask v1.0'
task exeTask001<< {
	println 'Project Name : ' + project.name
	println 'Project description : ' + project.description
	println 'Project group : ' + project.group
	println 'Project path : ' + project.path
 	println 'Project projectDir : ' + project.projectDir
 	println 'Project status : ' + project.status
	println 'Project state : ' + project.state.toString()
	println 'Project version : ' + project.version
}

task exeTask002<<{
	println project.description
}

gradle 실행결과

> Task :exeTask001

Project Name : 프로젝트 이름 출력

Project description: Project Object Description

Project group :

Project path : :

Project projectDir : D:\프로젝트경로

Project status : release

Project state : project state 'EXECUTED'

Project version : exeTask v1.0

 

> Task :exeTask002

Project Object Description

 

프로젝트 속성 정보들 출력

 

beforeEvaluate가 실행되지 않은 이유는 그레이들 라이프 사이클을 보면 프로젝트 설정단계에서 평가가 이루어지는데

build.gradle 파일에서는 바로 task가 실행되는 단계이기 때문에 실행되지 않았다.

이부분을 수행하게 만들려면 settings.gradle 파일을 이용하여야 한다.

 

settings.gradle에 allprojects블록을 옮김

allprojects{
	project ->
		  project.beforeEvaluate{
			println project.name + ' : check strat'
      		  }
     	 	  project.afterEvaluate{
			println project.name + ' : check end'
      		  }
}

 

 

옮기고 나서 다시 gradle 실행결과

> Configure project :

프로젝트 이름 : check start

------------------------------------------------asfasdfasdf-------

프로젝트 이름 : check end

 

> Task : exeTask001

이전과 동일한 실행결과

> Task :exeTask002

이전과 동일한 실행결과

 

프로젝트 객체를 이용하는(속성 및 API를 참조해서) 예제


2.Task 객체

Task객체는 Task컨테이너에 다양한 API를 사용하여 Task관련 객체를 작성하거나 참?할 수 있고

Project객체를 통하여 관련 작업 수행을 할 수 있도록 위임되어 있다

 

Task 객체의 동작

 - Action 객체를 상속하여 구성

   Action객체는 Gradle에서 작업을 처리하기 위한 최소의 기본 단위가 되는 객체

 - 내부적으로 execute() API 호출하여 실행

 - 예외처리를 통한 빌드 수행 제어

 

 

 

Task 객체의 속성

속성 설명
name 태스크 이름(프로젝트 내에서 태스크를 고유하게 식별)
description 태스크 설명
group 태스크가 속한 그룹(태스크 목록을 사용자에게 표시 할 때 관련 태스크를 그룹화하는 데 사용)
path 태스크의 경로(태스크의 정규화된 이름으로, 클론 ( : ) 으로 구분)
action 태스크에 의해 실행되는 순서 지정(action속성으로 Action 객체에 지정후 지정된 순서대로 실행)
dependsOn 태스크의 의존 관계 지정 및 표시
enabled 태스크의 실행 여부 설정
finalizedBy 해당 태스크 실행 후 최종 수행할 태스크 지정
inputs 태스크 입력 정보
mustRunAfter 태스크 실행순서 제어(강제적)
shouldRunAfter 태스크 실행 순서 제어(비강제적)
state 태스크의 실행 상태(실행 여부, 실패 여부 등 태스크 실행 관련 정보 제공)

 

 

 

Task 객체의 속성 이용 실습

task exeTask<<{
    // task 객체는 굳이 task.속성명 할 필요 없다.
	println 'exeTask name:' + name
	println 'exeTask path:' + path
	println 'exeTask description:' + description
	println 'exeTask group:' + group
}
// = 이라는 기호를 통해서도 값을 지정할 수 있지만 생략해도 속성값 지정 가능
exeTask.group 'Task Object'
exeTask.description = 'Task Object Script Code'

task exeAnoTask<<{
	println'dependsOn Task'
}
// 의존관계 설정
exeTask.dependsOn exeAnoTask

 

 

gradle exeTask 실행결과

> Task :exeAnoTask       // 의존 관계에 의해서 exeAnoTask가 먼저 실행됨

dependsOn Task         

> Task :exeTask

exeTask name : exeTask

exeTask path : exeTask

exeTask description : Task Object Script Code

exeTask group : Task Object

 

 

 

Task 객체의 API

API 설명
doFirst(action) 해당 테스크의 실행을 위한 Action 객체 리스트의 처음 부분에 위치하여
태스크가 실행될 때 먼저 처리
doLast(action) 해당 태스크의 실행을 위한 Action 객체 리스트의 마지막 부분에 위치하여 실행
deleteAllAction(action) 해당 태스크의 Action 객체 리스트 모두를 제거
leftShift(action) <<연산자를 사용하여 leftShift()호출
Action객체 리스트의 마지막 부분에 추가시킴
Property(propertyName) 태스크에 지정된 속성의 값을 출력
setProperty(name, value) 태스크의 속성 설정
hasProperty(propertyName) 지정된 속성을 가졌는지를 확인
dependsOn(paths) 태스크에 의존 관계
onlyIf(onlyIfSpec) 지정된 조건을 만족할 경우 태스크 실행

 

 

Task 객체의 API실습

이전 예제에서 doFirst, doLast, deleteAll 추가

task exeTask<<{
    // task 객체는 굳이 task.속성명 할 필요 없다.
	println 'exeTask name:' + name
	println 'exeTask path:' + path
	println 'exeTask description:' + description
	println 'exeTask group:' + group
}
// = 이라는 기호를 통해서도 값을 지정할 수 있지만 생략해도 속성값 지정 가능
exeTask.group 'Task Object'
exeTask.description = 'Task Object Script Code'

task exeAnoTask<<{
	println'dependsOn Task'
}
// 의존관계 설정
exeTask.dependsOn exeAnoTask

exeTask.doFirst{
	println 'Task Strart---->>'
}
exeTask.doLast{
	println '<------Task End'
}

exeTask.deleteAllActions()

 

 

gradle exeTask 실행결과

>Task :exeAnoTask

dependsOn Task

 

의존관계에 있었던 exeAnoTask만 출력되고 다른부분은 출력되지 않는다.

(exeTask.deleteAllActions()를 사용했기 때문)

 


3. Gradle 객체

해당 프로젝트에서 자체 실행환경을 나타내는 객체로

초기화 스크립트와 연관이 있는 객체이다.

 

 

Gradle 객체의 속성

속성 설명
gradle Gradle 객체 반환, 초기화 스크립트에서 gradle 속성과 메소드에 명시적으로 접근할 때 사용
gradleHomDir gradle의 홈 디렉터리 경로
gradleUserHomeDir 사용자의 홈 디렉터리 경로
gradleVersion 현재 사용 중인 gradle 버전
includeBuilds 포함된 빌드 관련 정보
plugins gradle 객체에 적용된 플러그인 컨테이너
rootProject Root 프로젝트 위치
startParameter 빌드 수행 관련 파라미터 정보
taskGraph 태스크 그래프 정보 표시

 

 

 

Gradle 객체의 속성 실습

task exeTask<{
	println 'Gradle Instance Properties=>'
	println '1.gradle.HomeDir :' + gradle.HomeDir
	println '2.gradle.UserHomeDir :' + gradle.UserHomeDir
	println '3.gradle.Version :' + gradle.gradleVersion
	println '4.rootProject :' + gradle.rootProject
	println '5.startParameter :' + gradle.startParameter
	println '6.taskGraph :' + gradle.taskGraph
}

 

gradle exeTask 실행결과

>Task :exeTask

1.gradle.HomeDir : C:\Gradle|gradle-경로

2.gradleUseHomeDIr : C:\Users\경로\.gradle

3.gradleVersion : 버전

4. rootProject : root project '프로젝트경로'

5. startParameter : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

6.taskGraph :org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@1270c5c6

 

 

 

Gradle 객체의 API

API 설명
addBuildListener(buildListener) BuildListener추가 빌드 실행 중 발생되는 이벤트 전달
addListener(listener) 지정된 리스터 추가, 지정된 인터페이스 구현 기능
removeListener(listener) 빌드로부터 지정된 리스너 제거
addProjectEvaluationListener(listener) 프로젝트 평가 리스너, 프로젝트 평가 시 이벤트 전달
afterProject() 프로젝트 평가 후 바로 호출형 작업 추가
apply() 플러그인 또는 스크립트 적용
beforeProject() 프로젝트가 평가되기 바로 전에 호출할 작업 추가
buildFinished() 빌드가 완료도리 때 호출할 작업 추가
projectsEvaluated() 모든 프로젝트를 평가된 후 호출할 작업 추가
projectsLoaded() 프로젝트가 빌드를 위해 로드된 후 호출할 작업 추가
settingsEvaluated() 프로젝트 고나련 빌드 설정이 로드 및 평가될 때 호출할 작업 추가
userLogger() Logger를 사용할 수 있도록 제공

 

 

 

Gradle 객체의 API - addListener() 이용 실습

지금까지의 실습 예제는 build.gradle 파일에 작성 하였지만

이번 파일은 init.gradle에 작성 build.gradle파일과 같은 경로에 위치시키면된다.

 

class addListenerExe implements TaskExecutionListener{
// TaskExecutionListener를 addListenerExe로 구현
	
    void beforeExecute(Task task){
		println 'beforeExecute :' + task.name    
	}

	void afterExecute(Task task, TaskState state){
		if(state.getExecuted()){
			println'afterExecute :' + task.name	
		}
	}
}
// TaskExecurionListener를 구현한 addListenerExe를 Gradle에 이벤트 리스너 추가
gradle.addListener(new addListenerExe())



gradle -I init.gradle help 실행결과 help는 Gradle에서 제공해주는 내장 task

>Task :help

beforeExecute : help

Welcome to Gradle 버.전

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

afterExecute : help

 

init.gradle은 task가 실행되기전 수행되는 초기화 스크립트이다.

 

 

 

 

 

Gradle 객체의 API - addListener() 이용 실습

TaskExecurionListener를 구현한 addListenerExe를

Gradle에 이벤트 리스너 추가

 

task exeTask<{
	println 'Gradle Instance Properties=>'
	println '1.gradle.HomeDir :' + gradle.HomeDir
	println '2.gradle.UserHomeDir :' + gradle.UserHomeDir
	println '3.gradle.Version :' + gradle.gradleVersion
	println '4.rootProject :' + gradle.rootProject
	println '5.startParameter :' + gradle.startParameter
	println '6.taskGraph :' + gradle.taskGraph
}
gradle.addListener(new addListenerExe())

settingsEvaluated{
	println '1 - settingsEvaluated() API'
}

projectsLoaded{
	println '2 - projectsLoaded() API'
}

beforeProject{
	println '3 - beforeProject() API'
}

afterProject{
	println '4 - afterProject() API'
}

projectsEvaluated{
	println '5 - projectsEvaluated() API'
}

buildFinished{
	println '6 - buildFinished() API'
}

 

 

gradle -I init.gradle exeTask 실행결과

~() API가 먼저 다 출력되고

exeTask 실행

 

 

 


4. Settings 객체

 

Settings 객체

 - 설정 스크립트(settings.gradle)와 연관

 - 멀티 프로젝트 설정

 - 프로젝트 빌드 수행 전 Settings 객체 먼저 생성

 

 

Settings 객체의 속성

속성 설명
gradle 현재 빌드를 위한 gradle 객체
plugins Settings 객체에 적용된 플러그인 컨테이너
rootDir 빌드의 루트 디렉터리
루트 디렉터리는 루트 프로젝트의 프로젝트 디렉터리
rootProject 빌드의 루트 프로젝트
settings Settings 객체 참조(자기 자신을 참조)
settingsDir 빌드의 설정 디렉터리(설정 디렉터리는 설정 파일을 포함한 디렉터리)
startParameter Gradle이 빌드를 수행할 때 사용된 명령어 인수

 

 

Settings 객체의 API

API 설명
findProject() 지정된 디렉터리 혹은 파일 경로와 일치하는 Project 객체 반환
(일치하는 디렉터리나 경로가 없을 시 null 값을 반환)
Project() findProject()와 동일하나 일치하는 값이 없을 시 에러 발생
Include() 계층형 멀티 프로젝트 추가 시 사용
includeFlat() 단층형 멀티 프로젝트 추가 시 사용

 

 

Settings 객체와 멀티 프로젝트

 

 


5. 기타 객체

 

기타 객체(몇가지만 따로 정리한 것)

객체 설명
Script Gradle의 특정 메서드를 추가하기 위해 사용.
Gradle의 스크립트에서 Script객체의 인터페이스를 구현하여 메서드와 속성을 사용
SourceSet SourceSet은 자바소스 및 자원에 대하여 그룹을 형성하여 사용
ExtensionAware Runtime에 다른 객체와 함께 확장하여 사용
extensions이라는 확장 속성을 저장하는 컨테이너 이용
ExtraPropertiesExtension ext로 정의된 확장 속성
has(), set(), get() 3가지 API로 특정한 키의 값 제어

 

 

 

 

 

 

반응형