빌드 스크립트 build.gradle.kts는 Project 객체를 구성합니다.
구분 | 스크립트 | 구성 |
빌드 스크립트 | ||
셋팅 스크립트 | ||
초기화 스크립트 |
프로퍼티(Properties)
빌드 스크립트에서 Top-Level의 프로퍼티와 블록은 Project 객체의 API입니다.
예시에서는 프로젝트의 이름에 접근하는 두 가지 방법을 보여줍니다.
println(name)
println(project.name)
코드 | 비고 | |
Top-Level에서 참조 가능한 Project 객체의 name 프로퍼티입니다. | ||
빌드 스크립트에서 많이 사용하는 Project 객체의 API 목록입니다.
프로퍼티 | 리턴 타입 | 비고 |
Project | ||
String | 프로젝트 디렉토리의 이름입니다. | |
String | 프로젝트의 절대 경로입니다. | |
String | 프로젝트에 대한 설명입니다. | |
File | ||
File | ||
Object | unspecified | |
Object | ||
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) }
}
}
코드 | 비고 | |
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)
}
}
코드 | 비고 | |
외부 스크립트에서의 객체 참조가 가능합니다.
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.kts는 Setting 객체를 구성합니다. - 초기화 스크립트
init.gradle.kts는 Gradle 객체를 구성합니다. - Kotlin으로 작성된
빌드 스크립트(.gradle.kts)를 실행하면 Gradle은 스크립트를 컴파일하여 KotlinProjectScriptTemplate의 자식 클래스로 생성합니다. - 빌드 스크립트는
KotlinProjectScriptTemplate이 선언하는 함수와 프로퍼티에 접근할 수 있습니다. 로컬 변수는 변수가 선언된 범위에서만 접근 할 수 있습니다.- 로컬 변수 선언은
val또는var키워드를 사용하며 Kotlin 문법의 특징을 따릅니다. extra 프로퍼티는extra키워드로 정의하고 엑세스합니다.extra프로퍼티는프로퍼티가 설정된 객체에 접근 가능한 모든 스크립트에서 접근하고 값을 변경 할 수 있습니다.- Gradle은
자주 사용되는 스크립트를 암묵적으로 import하고 있어 코드 사용을 간결하게 만듭니다.
'Build > Gradle' 카테고리의 다른 글
Windows에서 Gradle 설치하기 (0) | 2024.03.19 |
---|---|
Gradle 도큐먼트: 빌드 스크립트 build.gradle.kts 기본기 (0) | 2023.11.23 |
Gradle 도큐먼트: 명령줄 인터페이스(Command-Line Interface) 기본 사용법 (0) | 2023.11.21 |
Gradle 도큐먼트: 환경 변수(Environment variables)를 사용한 빌드 환경 구성 (0) | 2023.11.21 |
Gradle 도큐먼트: Gradle 프로퍼티(Gradle properties)를 사용한 빌드 환경 구성 (0) | 2023.11.17 |