빌드 자동화 도구. (오픈 소스)

Install

brew install gradle

Version Catalog

빌드

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를 제공한다.

javaPluginTasks

  • compileJava - java 소스 컴파일

  • processResources - 프로덕션 리소스를 프로덕션 리소스 디렉토리로 복사

  • classes -

  • compileTestJava - 테스트 소스 코드 컴파일

  • processTestResources

  • testClasses

  • jar - main 소스셋에 있는 클래스, 리소스를 기반으로 프로덕션 jar 파일 생성

  • javadoc - Javadoc을 이용하여 프로덕션 java 소스의 API 문서 생성

  • test - JUnit or TestNG 유닛 테스트 실행

  • clean - 프로젝트 빌드 디렉토리 삭제

  • cleanTaskName - 각 태스트에서 생성된 파일 제거. cleanJar, cleanTest, …​

SourceSet Tasks
  • compileSourceSetJava

  • processSourceSetResources

  • sourceSetClasses

Lifecycle Tasks
  • 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 library ignore deprecated main

  • 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

scope

coreweb-coreweb

Note
api
  • web에서 api("web-core") 하면 core 코드까지 사용 가능

  • core 수정 시 web-core, web 빌드

Note
implementation
  • web에서 implementation: web-core 하면 바로 web-core 코드만 사용 가능

  • core 수정시 web-core까지만 재빌드

:web-code 모듈에 :core 모듈이 api 일 때

build.gradle.kts in :web-core
dependencies {
   api(project(:core))
}

:web 모듈에 :web-core 모듈이 api 일 때

build.gradle.kts in :web
dependencies {
   api(project(:web-core))
}

:web-code 모듈에 :core 모듈이 implementation 일 때

build.gradle.kts in :web-core
dependencies {
   implementation(project(:core))
}

build

fat jar

Fat JAR란 모든 의존성에 있는 라이브러리가 자체 포함되어 있는 JAR 파일을 뜻한다. Fat JAR는 java -jar 명령어로 단독 실행할 수 있다.

build.gradle.kts

NamedDomainObjectContainerExtensions

creating

주어진 설정으로 기본 컬렉션을 생성

val myElement by myContainer.creating { myProperty = 42 }

NamedDomainObjectCollectionExtensions

getting

build.gradle.kts
val commonMain by getting
val commonMain by getting { }

대리자 속성(delegate property)을 통해 컬렉션의 기존 요소(element)를 참조하는 관용적 방법.