빌드 자동화 도구. (오픈 소스)
Install
brew install gradle
Version Catalog
-
https://docs.gradle.org/current/userguide/platforms.html#sub:version-catalog
-
버전 관리하기 위한 방법
-
기본적으로 버전을 한곳으로 모아줌 → Gradle 7.4 에서 생긴 의존성 버전 중앙 집중관리 방식.
-
세가지 그룹을 가짐
-
versions: 라이브러리 버전
-
libraries: 라이브러리 의존성
-
bundles: 라이브러리들을 묶어서 한번에 선언
-
-
참고
빌드
sourceCompatibility vs. targetCompatibility
-
sourceCompatibility
-
소스 언어 수준을 나타냄
-
컴파일에 사용하는 jdk 버전
-
소스 코드를 사용할 수 있는 java버전을 제한함
-
-
targetCompatibility
-
생성되는 바이크 코드의 수준을 나타냄
-
특정 VM 버전에 대한 class file을 생성함
-
클래스 파일은 이 설정에서 지정한 버전 이후는 실행되지만 이전 버전의 VM에서는 실행되지 않음
-
클래스 파일의 버전을 제어
-
프로그램에서 실행할 수 있는 가장 낮은 Java 버전을 의미
-
-
이 값들을 1.5로 지정한다고해서 항상 jdk 1.5로 코드를 컴파일 할 수 있고, jdk 1.5에서 작동할 것으로 예상할 수 있는 것이 아니다. 사용 가능한 라이브러리라는 것.
-
https://stackoverflow.com/questions/16654951/gradle-sourcecompatibility-vs-targetcompatibility
구성 방법
Cross project configuration
-
하위 프로젝트 간에 빌드 로직을 공유하는 방법으로
subproject {}
,allprojects {}
DSL을 통한 구성-
권장하지 않은 방식
-
-
이 방식을 사용하면 하위 프로젝트에 빌드 로직을 주입할 수 있는데, 이는 하위 프로젝트에서 보기에 명확하지 않아 로직을 이해하기 어렵게 만듦.
-
장기적으로 이 구성방법은 점점 더 많은 조건부 논리와 높은 유지보수 부담으로 복잡해짐
-
설정 시점에 프로젝트 간에 커플링이 생기기 때문에 configuration-on-demand와 같은 최적화가 제대로 작동하지 않는다.
-
이를 해결하기 위해 특정 타입의 하위 프로젝트에 플러그인 또는 설정을 적용
Convention Plugins
plugins
-
gradle task의 집합
PluginDependencySpec.apply
?
-
현재 프로젝트에 플러그인의 적용 여부를 지정, 설정하지 않으면 프로젝트의 classpath에만 설정.
-
default:
true
-
플러그인의 클래스를 재사용하거나 하위 프로젝트에 적용할 때 유용함
plugins { id "org.company.myplugin" version "1.0" apply false } subprojects { if (someCondition) { apply plugin: "org.company.myplugin" } }
The Java Plugin
plugins {
java
}
Java 플러그인은 프로젝트에 테스트 및 번들링 기능과 할께 컴파일을 추가한다.
다음과 같은 task를 제공한다.
-
compileJava
- java 소스 컴파일 -
processResources
- 프로덕션 리소스를 프로덕션 리소스 디렉토리로 복사 -
classes
- -
compileTestJava
- 테스트 소스 코드 컴파일 -
processTestResources
-
testClasses
-
jar
-main
소스셋에 있는 클래스, 리소스를 기반으로 프로덕션 jar 파일 생성 -
javadoc
- Javadoc을 이용하여 프로덕션 java 소스의 API 문서 생성 -
test
- JUnit or TestNG 유닛 테스트 실행 -
clean
- 프로젝트 빌드 디렉토리 삭제 -
cleanTaskName
- 각 태스트에서 생성된 파일 제거.cleanJar
,cleanTest
, …
-
compileSourceSetJava
-
processSourceSetResources
-
sourceSetClasses
-
assemble
- 모든 아카이브를 취합하는 집계 작업 -
check
- 테스트 같은 확인 작업을 수행하는 집계 작업 -
build
- 프로젝트듸 전체 빌드 작업을 수행하는 집계 작업 -
buildNeeded
-
buildDepencents
-
buildConfigName
-
uploadConfigName
프로젝트 레이아웃
기본적으로 아래와 같은 디렉토리를 따른다.
-
src/main/java
-
src/test/java
-
src/test/resources
-
src/sourceSet/java
-
src/sourceSet/resources
소스 셋
-
main
,test
의존성 관리
-
implementation
- 구현 전용 의존성 -
compileOnly
- 런타임에 사용하지 않고 컴파일에만 사용될 경우
api
는 java plugin이 아니라 java library plugin에서 추가된 dependency configuration이다.
The Java Libaray Plugins
-
java plugin과 java library plugin의 주요 차이점은 java libaray plugin는 consumer에게 노출되는
api
개념을 도입한다는 것
task
projects
./gradlew -q projects
multi-project 빌드 구조를 파악할 수 있음.
-q
(--quiet
) 옵션은 "Log errors only." 오류만 로깅하는 설정.
tasks
./gradlew tasks --all
Etc
-
assembleRelease: .apk 파일 만들어주는 android 태스크
option
scan
-
--scan
옵션을 추가하면 결과를 웹 UI로 볼 수 있음 -
다만, gradle에 결과를 전송해서 보는 방식
scope
core
← web-core
← web
Note
|
api
|
Note
|
implementation
|
:web-code 모듈에 :core 모듈이 api 일 때
dependencies {
api(project(:core))
}
:web 모듈에 :web-core 모듈이 api 일 때
dependencies {
api(project(:web-core))
}
:web-code 모듈에 :core 모듈이 implementation 일 때
dependencies {
implementation(project(:core))
}
build
- fat jar
-
Fat JAR란 모든 의존성에 있는 라이브러리가 자체 포함되어 있는 JAR 파일을 뜻한다. Fat JAR는 java -jar 명령어로 단독 실행할 수 있다.
build.gradle.kts
NamedDomainObjectContainerExtensions
NamedDomainObjectCollectionExtensions
getting
val commonMain by getting
val commonMain by getting { }
대리자 속성(delegate property)을 통해 컬렉션의 기존 요소(element)를 참조하는 관용적 방법.