본문 바로가기

Build/Gradle

Gradle 도큐먼트: 빌드 스크립트 build.gradle.kts 더 보기

더보기

빌드 스크립트를 작성하는 것은 프로젝트를 구성하는 것과 같습니다.

Gradle 프로젝트는 빌드가 필요한 어떤 소프트웨어의 구성 요소(라이브러리 또는 애플리케이션)를 의미합니다.

빌드 스크립트는 Project 타입의 객체와 연결됩니다. 빌드 스크립트가 실행되면 스크립트는 Project 객체를 구성합니다.

빌드 스크립트 build.gradle.ktsProject 객체를 구성합니다.

구분 스크립트 구성
빌드 스크립트 build.gradle.kts Project 객체를 구성
셋팅 스크립트 settings.gradle.kts Setting 객체를 구성
초기화 스크립트 init.gradle.kts Gradle 객체를 구성

프로퍼티(Properties)

빌드 스크립트에서 Top-Level의 프로퍼티와 블록은 Project 객체의 API입니다.

예시에서는 프로젝트의 이름에 접근하는 두 가지 방법을 보여줍니다.

println(name)
println(project.name)
코드 비고
Line 1 name Top-Level에서 참조 가능한 Project 객체의 name 프로퍼티입니다.
Line 2 project.name project 프로퍼티는 모든 빌드 스크립트에서 사용 가능하며 할당된 Project 객체를 리턴합니다.

빌드 스크립트에서 많이 사용하는 Project 객체의 API 목록입니다.

프로퍼티 리턴 타입 비고
project Project Project 객체를 반환합니다.
name String 프로젝트 디렉토리의 이름입니다.
path String 프로젝트의 절대 경로입니다.
description String 프로젝트에 대한 설명입니다.
projectDir File 빌드 스크립트가 위치한 디렉토리를 반환합니다.
buildDir File <프로젝트 루트 디렉토리>/build 디렉토리를 반환합니다.
group Object unspecified
version Object
ant AntBuilder AntBuilder 객체를 반환합니다.

Kotlin으로 작성된 빌드 스크립트(.gradle.kts)를 실행하면 Gradle은 스크립트를 컴파일하여 KotlinProjectScriptTemplate의 자식 클래스로 생성합니다.

따라서 빌드 스크립트는 KotlinProjectScriptTemplate이 선언하는 함수와 프로퍼티에 접근 할 수 있습니다.

더보기

마찬가지로 Groovy로 작성된 빌드 스크립트(.gradle)Script 인터페이스를 구현합니다.

빌드 스크립트는 컴파일 과정을 통해 Script 인터페이스가 선언하는 함수와 프로퍼티에 접근 할 수 있습니다.

변수 선언

빌드 스크립트는 로컬 변수(Local variables)와 extra 프로퍼티가 있습니다.

로컬 변수는 변수가 선언된 범위에서만 접근 할 수 있습니다. 변수 선언은 val 또는 var 키워드를 사용하며 Kotlin 문법의 특징을 따릅니다.

val dest = "dest"

tasks.register<Copy>("copy") {
    from("source")
    into(dest)
}

Gradle의 모든 Projects Tasks SourceSets은 사용자가 정의한 프로퍼티를 가질 수 있습니다.

Add Read Set과 같은 extra 프로퍼티extra 키워드로 정의하고 엑세스합니다.

plugins {
    id("java-library")
}

val springVersion by extra("3.1.0.RELEASE")
val emailNotification by extra { "build@master.org" }

sourceSets.all { extra["purpose"] = null }

sourceSets {
    main {
        extra["purpose"] = "production"
    }
    test {
        extra["purpose"] = "test"
    }
    create("plugin") {
        extra["purpose"] = "production"
    }
}

tasks.register("printProperties") {
    val springVersion = springVersion
    val emailNotification = emailNotification
    val productionSourceSets = provider {
        sourceSets.matching { it.extra["purpose"] == "production" }.map { it.name }
    }
    doLast {
        println(springVersion)
        println(emailNotification)
        productionSourceSets.get().forEach { println(it) }
    }
}
코드 비고
Line 5:6 by extra project 객체에 두 개의 extra 프로퍼티를 추가합니다.
Line 8 extra["purpose"] = nul sourceSetsextra 프로퍼티 purpose를 모두 null로 초기화합니다.
Line 10:20 extra["purpose"] = "production"
extra["purpose"] = "test"
sourceSetsextra 프로퍼티 purpose를 입력합니다.

extra 프로퍼티는 이를 소유하는 객체에 엑세스 할 수 있는 모든 곳에서 읽고 쓸 수 있습니다.

따라서 로컬 변수보다 더 넓은 범위의 엑세스를 제공하며, 하위 프로젝트에서도 상위 프로젝트의 프로퍼티를 참조 할 수 있도록 합니다.

자세한 내용은 ExtraPropertiesExtension을 참고합니다.

객체 선언과 생성

Gradle은 class 키워드로 클래스를 선언하고 객체를 생성 할 수 있습니다.

class UserInfo(
    var name: String? = null, 
    var email: String? = null
)

tasks.register("configure") {
    val user = UserInfo().apply {
        name = "Isaac Newton"
        email = "isaac@newton.me"
    }
    
    doLast {
        println(user.name)
        println(user.email)
    }
}
코드 비고
Line 1:4 class UserInfo UserInfo 클래스를 정의하고 필드를 지정합니다.
Line 7:10 Userinfo().apply { } UserInfo 클래스를 객체로 생성하고 필드를 초기화합니다.

외부 스크립트에서의 객체 참조가 가능합니다.

Groovy에서만 사용 할 수 있는 기능이며 Kotlin DSL은 이를 지원하지 않습니다. 자세한 내용은 gradle/kotlin-dsl#659를 참고합니다.

암묵적/기본 Imports

Gradle은 빌드 스크립트에서 암묵적인 import 구문을 포함하고 있습니다.

우리가 스크립트에서 throw new org.gradle.api.tasks.StopExecutionException() 대신 throw new StopExecutionException()처럼 작성 할 수 있는 이유입니다.

import org.gradle.*
import org.gradle.api.*
import org.gradle.api.artifacts.*
import org.gradle.api.artifacts.component.*
import org.gradle.api.artifacts.dsl.*
import org.gradle.api.artifacts.ivy.*
import org.gradle.api.artifacts.maven.*
import org.gradle.api.artifacts.query.*
import org.gradle.api.artifacts.repositories.*
import org.gradle.api.artifacts.result.*
import org.gradle.api.artifacts.transform.*
import org.gradle.api.artifacts.type.*
import org.gradle.api.artifacts.verification.*
import org.gradle.api.attributes.*
import org.gradle.api.attributes.java.*
import org.gradle.api.attributes.plugin.*
import org.gradle.api.cache.*
import org.gradle.api.capabilities.*
import org.gradle.api.component.*
import org.gradle.api.credentials.*
import org.gradle.api.distribution.*
import org.gradle.api.distribution.plugins.*
import org.gradle.api.execution.*
import org.gradle.api.file.*
import org.gradle.api.flow.*
import org.gradle.api.initialization.*
import org.gradle.api.initialization.definition.*
import org.gradle.api.initialization.dsl.*
import org.gradle.api.initialization.resolve.*
import org.gradle.api.invocation.*
import org.gradle.api.java.archives.*
import org.gradle.api.jvm.*
import org.gradle.api.launcher.cli.*
import org.gradle.api.logging.*
import org.gradle.api.logging.configuration.*
import org.gradle.api.model.*
import org.gradle.api.plugins.*
import org.gradle.api.plugins.antlr.*
import org.gradle.api.plugins.catalog.*
import org.gradle.api.plugins.jvm.*
import org.gradle.api.plugins.quality.*
import org.gradle.api.plugins.scala.*
import org.gradle.api.problems.*
import org.gradle.api.provider.*
import org.gradle.api.publish.*
import org.gradle.api.publish.ivy.*
import org.gradle.api.publish.ivy.plugins.*
import org.gradle.api.publish.ivy.tasks.*
import org.gradle.api.publish.maven.*
import org.gradle.api.publish.maven.plugins.*
import org.gradle.api.publish.maven.tasks.*
import org.gradle.api.publish.plugins.*
import org.gradle.api.publish.tasks.*
import org.gradle.api.reflect.*
import org.gradle.api.reporting.*
import org.gradle.api.reporting.components.*
import org.gradle.api.reporting.dependencies.*
import org.gradle.api.reporting.dependents.*
import org.gradle.api.reporting.model.*
import org.gradle.api.reporting.plugins.*
import org.gradle.api.resources.*
import org.gradle.api.services.*
import org.gradle.api.specs.*
import org.gradle.api.tasks.*
import org.gradle.api.tasks.ant.*
import org.gradle.api.tasks.application.*
import org.gradle.api.tasks.bundling.*
import org.gradle.api.tasks.compile.*
import org.gradle.api.tasks.diagnostics.*
import org.gradle.api.tasks.diagnostics.configurations.*
import org.gradle.api.tasks.incremental.*
import org.gradle.api.tasks.javadoc.*
import org.gradle.api.tasks.options.*
import org.gradle.api.tasks.scala.*
import org.gradle.api.tasks.testing.*
import org.gradle.api.tasks.testing.junit.*
import org.gradle.api.tasks.testing.junitplatform.*
import org.gradle.api.tasks.testing.testng.*
import org.gradle.api.tasks.util.*
import org.gradle.api.tasks.wrapper.*
import org.gradle.api.toolchain.management.*
import org.gradle.authentication.*
import org.gradle.authentication.aws.*
import org.gradle.authentication.http.*
import org.gradle.build.event.*
import org.gradle.buildinit.*
import org.gradle.buildinit.plugins.*
import org.gradle.buildinit.tasks.*
import org.gradle.caching.*
import org.gradle.caching.configuration.*
import org.gradle.caching.http.*
import org.gradle.caching.local.*
import org.gradle.concurrent.*
import org.gradle.external.javadoc.*
import org.gradle.ide.visualstudio.*
import org.gradle.ide.visualstudio.plugins.*
import org.gradle.ide.visualstudio.tasks.*
import org.gradle.ide.xcode.*
import org.gradle.ide.xcode.plugins.*
import org.gradle.ide.xcode.tasks.*
import org.gradle.ivy.*
import org.gradle.jvm.*
import org.gradle.jvm.application.scripts.*
import org.gradle.jvm.application.tasks.*
import org.gradle.jvm.tasks.*
import org.gradle.jvm.toolchain.*
import org.gradle.language.*
import org.gradle.language.assembler.*
import org.gradle.language.assembler.plugins.*
import org.gradle.language.assembler.tasks.*
import org.gradle.language.base.*
import org.gradle.language.base.artifact.*
import org.gradle.language.base.compile.*
import org.gradle.language.base.plugins.*
import org.gradle.language.base.sources.*
import org.gradle.language.c.*
import org.gradle.language.c.plugins.*
import org.gradle.language.c.tasks.*
import org.gradle.language.cpp.*
import org.gradle.language.cpp.plugins.*
import org.gradle.language.cpp.tasks.*
import org.gradle.language.java.artifact.*
import org.gradle.language.jvm.tasks.*
import org.gradle.language.nativeplatform.*
import org.gradle.language.nativeplatform.tasks.*
import org.gradle.language.objectivec.*
import org.gradle.language.objectivec.plugins.*
import org.gradle.language.objectivec.tasks.*
import org.gradle.language.objectivecpp.*
import org.gradle.language.objectivecpp.plugins.*
import org.gradle.language.objectivecpp.tasks.*
import org.gradle.language.plugins.*
import org.gradle.language.rc.*
import org.gradle.language.rc.plugins.*
import org.gradle.language.rc.tasks.*
import org.gradle.language.scala.tasks.*
import org.gradle.language.swift.*
import org.gradle.language.swift.plugins.*
import org.gradle.language.swift.tasks.*
import org.gradle.maven.*
import org.gradle.model.*
import org.gradle.nativeplatform.*
import org.gradle.nativeplatform.platform.*
import org.gradle.nativeplatform.plugins.*
import org.gradle.nativeplatform.tasks.*
import org.gradle.nativeplatform.test.*
import org.gradle.nativeplatform.test.cpp.*
import org.gradle.nativeplatform.test.cpp.plugins.*
import org.gradle.nativeplatform.test.cunit.*
import org.gradle.nativeplatform.test.cunit.plugins.*
import org.gradle.nativeplatform.test.cunit.tasks.*
import org.gradle.nativeplatform.test.googletest.*
import org.gradle.nativeplatform.test.googletest.plugins.*
import org.gradle.nativeplatform.test.plugins.*
import org.gradle.nativeplatform.test.tasks.*
import org.gradle.nativeplatform.test.xctest.*
import org.gradle.nativeplatform.test.xctest.plugins.*
import org.gradle.nativeplatform.test.xctest.tasks.*
import org.gradle.nativeplatform.toolchain.*
import org.gradle.nativeplatform.toolchain.plugins.*
import org.gradle.normalization.*
import org.gradle.platform.*
import org.gradle.platform.base.*
import org.gradle.platform.base.binary.*
import org.gradle.platform.base.component.*
import org.gradle.platform.base.plugins.*
import org.gradle.plugin.devel.*
import org.gradle.plugin.devel.plugins.*
import org.gradle.plugin.devel.tasks.*
import org.gradle.plugin.management.*
import org.gradle.plugin.use.*
import org.gradle.plugins.ear.*
import org.gradle.plugins.ear.descriptor.*
import org.gradle.plugins.ide.*
import org.gradle.plugins.ide.api.*
import org.gradle.plugins.ide.eclipse.*
import org.gradle.plugins.ide.idea.*
import org.gradle.plugins.signing.*
import org.gradle.plugins.signing.signatory.*
import org.gradle.plugins.signing.signatory.pgp.*
import org.gradle.plugins.signing.type.*
import org.gradle.plugins.signing.type.pgp.*
import org.gradle.process.*
import org.gradle.swiftpm.*
import org.gradle.swiftpm.plugins.*
import org.gradle.swiftpm.tasks.*
import org.gradle.testing.base.*
import org.gradle.testing.base.plugins.*
import org.gradle.testing.jacoco.plugins.*
import org.gradle.testing.jacoco.tasks.*
import org.gradle.testing.jacoco.tasks.rules.*
import org.gradle.testkit.runner.*
import org.gradle.util.*
import org.gradle.vcs.*
import org.gradle.vcs.git.*
import org.gradle.work.*
import org.gradle.workers.*

정리 및 복습

  • 빌드 스크립트 build.gradle.kts Project 객체를 구성합니다.
  • 셋팅 스크립트 settings.gradle.ktsSetting 객체를 구성합니다.
  • 초기화 스크립트 init.gradle.ktsGradle 객체를 구성합니다.
  • Kotlin으로 작성된 빌드 스크립트(.gradle.kts)를 실행하면 Gradle은 스크립트를 컴파일하여 KotlinProjectScriptTemplate의 자식 클래스로 생성합니다.
  • 빌드 스크립트는 KotlinProjectScriptTemplate이 선언하는 함수와 프로퍼티에 접근 할 수 있습니다.
  • 로컬 변수는 변수가 선언된 범위에서만 접근 할 수 있습니다.
  • 로컬 변수 선언은 val 또는 var 키워드를 사용하며 Kotlin 문법의 특징을 따릅니다.
  • extra 프로퍼티 extra 키워드로 정의하고 엑세스합니다.
  • extra 프로퍼티는 프로퍼티가 설정된 객체에 접근 가능한 모든 스크립트에서 접근하고 값을 변경 할 수 있습니다.
  • Gradle은 자주 사용되는 스크립트를 암묵적으로 import하고 있어 코드 사용을 간결하게 만듭니다.