Gradle userguide.html
- 스크립트를 이용해 유연한 빌드 자동화 툴
- 변경이 없는 빌드 절차의 결과를 재사용하므로, 빠른 빌드 가능
- CLI
스크립트는 Groovy, Kotlin으로 작성 가능
↓ shell
build.gradle
Task; 작업 custom_tasks.htmlmore_about_tasks.html
↓ gradle
Task dependencies; 작업 의존
↓ gradle
결과 ↓
↓ text
Dynamic tasks; 동적 작업 정의
↓ gradle
Groovy DSL shortcut notations; 그루비 축약 표현
↓ gradle
결과 ↓
↓ text
Extra task properties; 사용자 정의 속성 정의
↓ gradle
Using methods; 사용자 정의 메서드 이용
↓ gradle
결과 ↓
↓ text
Default tasks; 기본 실행 작업
↓ gradle
External dependencies; 스크립트에서 외부 클래스 사용
↓ gradle
- buildscript() 메서드는 ScriptHandler.html 인스턴스를 구성한다
- 프로젝트의 buildscript()는 모든 서브 프로젝트에도 적용된다
외부 스크립트 포함
↓ gradle
작업 설명
↓ gradle
결과 ↓
↓ text
기존 작업 덮어쓰기
↓ gradle
특정 조건을 만족하는 경우에만 실행
↓ gradle
결과 ↓
↓ shell
빌드 절차
Initialization
- 어떤 프로젝트들을 빌드해야 하는지 결정하고, org.gradle.api.Project.html 인스턴스를 만든다
- 루트 프로젝트에 존재하는 settings.gradle 스크립트(-c 또는 --settings-file 옵션으로 다른 파일 지정 가능)가 실행된다multi_project_builds
- -I 또는 --init-script 옵션을 지정하는 경우, init_scripts를 실행한다
- USER_HOME/.gradle/ 에 init.gradle을 작성하면 초기화 시 실행된다
- USER_HOME/.gradle/init.d/, GRADLE_HOME/init.d/ 에 임의 .gradle 스크립트를 넣으면 초기화 시 실행된다
후자는 커스텀 gradle 배포에 이용하면 된다
↓ gradle
↑ 이를 자동으로 적용하려면, gradle을 새로 압축하여 gradlew에서 이용하면 된다
gradle wrapper 생성 후, gradle-wrapper.properties에
distributionUrl=${customGradleUrl}
Configuration
Project 인스턴스의 설정이 진행된다. 빌드될 각 프로젝트의 build.gradle 스크립트가 실행된다
Execution
구성 단계에서 실행하기로 결정된 작업들을 실행한다
↓ gradle
기본 작업
org.gradle.api.tasks.Copy.html
↓ gradle
org.gradle.api.tasks.Delete.html
↓ gradle
org.gradle.api.tasks.Exec.html
↓ gradle
org.gradle.api.tasks.JavaExec.html
- 예1
- 예2
↓ gradle
↓ gradle
org.gradle.api.tasks.bundling.Zip.html
↓ gradle
org.gradle.api.tasks.bundling.Tar.html
Zip 유사
Project
Script blocks
- allprojects {}
- artifacts {}
- buildscript {}
- configurations {}
- dependencies {}
- repositories {}
- subprojects {}
- application {}
- eclipse {}
- idea {}
- sourceSets {}
- visualStudio {}
프로젝트 및 서브 프로젝트 설정 org.gradle.api.Project:allprojects(groovy.lang.Closure)
빌드 출력물 설정 org.gradle.api.Project:artifacts(groovy.lang.Closure)
클래스패스 설정 org.gradle.api.Project:buildscript(groovy.lang.Closure)
프로젝트 관련 설정 org.gradle.api.Project:configurations(groovy.lang.Closure)
프로젝트 의존성 설정 org.gradle.api.Project:dependencies(groovy.lang.Closure)
저장소 설정 org.gradle.api.Project:repositories(groovy.lang.Closure)
서브프로젝트 설정 org.gradle.api.Project:subprojects(groovy.lang.Closure)
application 플러그인으로 추가된다. org.gradle.api.plugins.JavaApplication.html 설정
eclipse 플러그인으로 추가된다. org.gradle.plugins.ide.eclipse.model.EclipseModel.html 설정
idea 플러그인으로 추가된다. org.gradle.plugins.ide.idea.model.IdeaModel.html 설정
java 플러그인으로 추가된다. 소스셋 설정
visual-studio 플러그인으로 추가된다. org.gradle.ide.visualstudio.VisualStudioRootExtension.html 설정
Properties
↓ gradle
Methods
↓ gradle
Dependency configuration
↓ gradle
Custom configuration
↓ gradle
멀티 프로젝트 설정
종류
- 계층형 : 각 프로젝트에 상하 관계가 존재
- 단층형 : 각 프로젝트는 독립적으로 존재
↓ gradle
↓ gradle
관련 Script block
↓ gradle
JUnit 테스트
- java_testing.html
- 단위 테스트 클래스 지정
- 단위 테스트 카테고리 지정
- 특정 테스트 클래스 집합만 테스트
- 특정 소스셋만 테스트
- 병렬 테스트
↓ gradle
↓ gradle
↓ gradle
↓ java
↓ gradle
↓ gradle
↓ gradle
gradle.properties
- sec:gradle_configuration_properties
- Gradle properties
- System properties
- gradle 명령이 참조하는 환경 변수
- 프록시 설정
↓ properties
↓ properties
↓ shell
↓ properties
Gradle 성능 organizing_gradle_projects
- Build scan
- 프로젝트에 항상 settings.gradle을 둘 것
- gradle.properties를 모든 프로젝트에 적용시키려는 경우
- 각 작업의 출력 디렉터리는 혼자만 사용함이 바람직하다
--scan 옵션으로 실행하면 된다. 서로 다른 gradle 버전의 출력이 같은지 비교하는 데도 이용 가능
↓ shell

<이미지 - Gradle build scan result example>
매 실행 시마다 settings.gradle이 있는지 찾으므로, 빈 파일이라도 만들어 두는 것이 좋다
GRADLE_USER_HOME 디렉터리에 위치시키면 된다
여러 작업이 동일한 출력 디렉터리를 이용하는 경우, 전체 빌드가 느려지고 빌드 캐시가 무용지물이 된다
디버깅
기본 설정 : suspend=y,address=5005
↓ shell
재정의 예1
↓ gradle
재정의 예2
↓ gradle
안드로이드
Build variant; 빌드 변형
- 제품 특성 : free, pro
- 빌드 타입 : debug, staging, release
- 빌드 변형 : FreeDebug ~ ProRelease
예
- assemble : 모든 빌드 변형 빌드
- assemblePro : 모든 pro 변형 빌드
- assembleDebug : 모든 debug 변형 빌드
- assembleProDebug : ProDebug만 발드
Gradle 플러그인
- plugin_reference.html
- 플러그인은 Gradle 코어 기능을 확장하여 새로운 작업, 데이터 모델을 이용하게 한다
- 플러그인은 프로젝트와 무관하게 사용 가능하다
- 플러그인의 적용apply-T-은 여러 번 호출해도 부작용이 없다
- 사용할 플러그인 이름은 Fully qualified name이어야 하지만, 특별히 정의된 짧은 이름도 사용할 수 있다
- groovy, java, kotlin으로 작성 가능
예. JavaPlugin → 'java'
Binary plugin
Plugin.html 인터페이스를 구현한 임의 클래스를 플러그인으로 이용할 수 있다
플러그인 포함 및 적용
'java' 플러그인은 Core Gradle의 일부이므로 적용한다고 선언만하면 되지만, 대개의 플러그인들은 클래스를 찾기 위해 jar를 포함시켜야 한다
↓ gradle
- 플러그인 포털https://plugins.gradle.org/ 또는 사용자 지정 저장소로부터 포함
- 플러그인 포함 및 적용
- 서브 프로젝트만 적용하는 플러그인
- 외부 jar 지정
- buildSrc로 소스코드 포함(코드를 갖고 있지 않으면 외부에서 사용 불가)
- 스크립트 안의 클래스로 정의(스크립트 외부 사용은 불가)
↓ gradle
↓ gradle
↓ gradle
base 플러그인
Task
- clean
출력 디렉터리(기본값 build/)org.gradle.api.Project:buildDir를 정리한다
Java 플러그인
Task
- clean - org.gradle.api.tasks.Delete.html
- clean{TaskName} - org.gradle.api.tasks.Delete.html
- compileJava - org.gradle.api.tasks.compile.JavaCompile.html
- Depends on : 컴파일 경로를 변경하는 모든 작업 + jar
- 프로덕션(main 소스셋) .java 소스 코드 컴파일
- org.gradle.api.tasks.compile.CompileOptions.html JavaCompile.options
- processResources - org.gradle.api.tasks.Copy.html
- classes
- jar - org.gradle.api.tasks.bundling.Jar.html
- javadoc - org.gradle.api.tasks.javadoc.Javadoc.html
- compileTestJava - org.gradle.api.tasks.compile.JavaCompile.html
- processTestResources - org.gradle.api.tasks.Copy.html
- testClasses
- test - org.gradle.api.tasks.testing.Test.html
build 디렉터리 제거
해당 작업 출력 제거
↓ gradle
프로덕션(main 소스셋) 리소스를 지정 디렉터리로 복사
Depends on : compileJava, processResources
원한다면 추가 작업을 덧붙여도 된다
Depends on : classes
main 소스 셋의 클래스 및 리소스로 프로덕션용 jar 빌드
Depends on : classes
↓ gradle
API 문서 생성
테스트 .java 소스 코드 컴파일
테스트 리소스를 지정 디렉터리로 복사
Depends on : compileTestJava, processTestResources
원한다면 추가 작업을 덧붙여도 된다
Depends on : testClasses + test runtime classpath를 생성하는 작업들
JUnit 또는 TestNG로 단위 테스트 진행
SourceSet Task
- compile{SourceSet}Java - org.gradle.api.tasks.compile.JavaCompile.html
- process{SourceSet}Resources - org.gradle.api.tasks.Copy.html
- {sourceSet}Classes
Depends on : 해당 소스셋의 컴파일 경로를 변경하는 모든 작업
해당 소스셋의 리소스들을 복사
Depends on : compile{SourceSet}Java, process{SourceSet}Resources
Project layout
- 기본(default) 구조
- 설정 변경
↓ text
↓ gradle
SourceSet
- 기본적으로 main, test 소스셋이 추가된다
- 속성
- 신규 소스셋 추가
한정자 | 타입 | 이름 | 설명 |
---|---|---|---|
readonly | String | name | 소스셋 이름 |
readonly | SourceSetOutput | output | 출력 클래스 + 리소스 파일들 |
readonly | FileCollection | output.classesDirs | 클래스 출력 경로, 기본값 {buildDir}/classes/java/{name} |
File | output.resourcesDir | 리소스 출력 경로, 기본값 {buildDir}/resources/{name} | |
FileCollection | compileClasspath | 기본값 {name}CompileClasspath 설정 | |
FileCollection | annotationProcessorPath | 기본값 {name}AnnotationProcessor 설정 | |
FileCollection | runtimeClasspath | 기본값 {output} + {name}RuntimeClasspath 설정 | |
readonly | SourceDirectorySet | java | .java 파일들 |
Set<File> | java.srcDirs | 자바 소스가 디렉터리들, 기본값 src/{name}/java | |
File | java.outputDir | 기본값 {buildDir}/classes/java/{name} | |
readonly | SourceDirectorySet | resources | .java를 제외한 리소스 파일들 |
Set<File> | resources.srcDirs | 리소스 디렉터리들, 기본값 src/{name}/resources |
↓ gradle
Contributed extension
가능한 버전은 다음 링크 참고 JavaVersion.html
↓ gradle
Convention properties
한정자 | 타입 | 이름 | 설명 |
---|---|---|---|
String | reporting.baseDir | 빌드 결과 출력 디렉터리 이름, 기본값 reports | |
readonly | File | reportsDir | {buildDir}/{reporting.baseDir} |
String | testReportDirName | 테스트 결과 출력 디렉터리 이름, 기본값 tests | |
readonly | File | testReportDir | {reportsDir}/{testReportDirName} |
readonly | SourceSetContainer | sourceSets | |
String | archivesBaseName | 기본값 {projectName} | |
Dependency configurations
- implementation : 프로덕션 컴파일에 필요. 외부에 API로 노출하지는 않음
- api : 프로덕션 컴파일에 필요. 외부에 API로도 노출
- testImplementation : 테스트 컴파일에 필요
- 위 기본 설정으로부터 확장 가능 : org.gradle.api.artifacts.Configuration:extendsFrom(org.gradle.api.artifacts.Configuration[])
java-library 플러그인
- jar 파일명에 버전 포함하기
- jar manifest 조정
- javadoc 생성
↓ gradle
↓ shell
↓ gradle
↓ shell
Application 플러그인
↓ gradle
War 플러그인
↓ gradle
↓ gradle
사용자 정의 플러그인
- 빌드 스크립트에 플러그인 클래스 정의하면 즉시 사용 가능
- 프로젝트의 buildSrc에 플러그인 코드를 두면 즉시 사용 가능
- id 설정
- buildSrc/src/main/resources/META-INF/gradle-plugins/{id}.properties
- jar : META-INF/gradle-plugins/{id}.properties
- 또는 http://plugins.gradle.org 에 플러그인 등록 publishing-plugins-to-gradle-plugin-portal
- 외부 jar에 정의된 플러그인을 사용하려면, 해당 jar를 buildscript.dependencies에 추가해야 한다
Groovy 코드 경로 : buildSrc/src/main/groovy/...
↓ 실행 결과
↓ text
↓ gradle
Gradle Wrapper; gradlew
Gradle이 설치되지 않았어도, 프로젝트가 필요로 하는 버전의 Gradle을 자동으로 설치해 이용한다
↓ gradle
다운로드에 필요한 HTTP 기본 인증 정보를 파일로 설정 가능
↓ properties
- © Donggi Kim. MIT License
- w3css : No license
- highlight.js : BSD-3-Clause License
- MathJax : Apache License 2.0
- qrcodejs : MIT License