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로 특정한 키의 값 제어 |
'프로그래밍 공부 > Gradle' 카테고리의 다른 글
Gradle 의존관계 관리, 환경구성 정의, 저장소 정의 (0) | 2021.09.08 |
---|---|
Gradle의 파일처리 파일관리 파일참조, 파일복사, 파일삭제 (0) | 2021.09.06 |
Gradle의 태스크(task) 10. Gradle의 태스크 그래프 (0) | 2021.09.03 |
Gradle의 스크립트 파일, Gradle 실습준비 eclipse IDE (0) | 2021.09.02 |
빌드란?, Gradle의 빌드, Gradle의 빌드 수행 (0) | 2021.09.01 |