2019년 1월 23일
Kotlin 1.3.20의 릴리스를 기쁘게 알려드립니다. 이 버전은 Kotlin 1.3의 버그 수정과 도구 업데이트를 포함하고 있습니다. 컴파일러와 IDE의 개선 사항 외에도 이 버전에서는 다음과 같은 기능들이 추가되었습니다:
- 단일 프로젝트 내에서 Gradle 작업을 병렬로 실행할 수 있도록 합니다.
- Gradle Kotlin DSL을 통해 멀티플랫폼 프로젝트를 빌드할 수 있도록 합니다.
- 인라인 클래스에 대한 개선 사항을 제공합니다.
- Kapt를 위한 별도의 커맨드 라인 도구를 도입합니다.
- Kotlin/JS의 증분 컴파일을 기본으로 활성화합니다.
- Kotlin/Native에 대한 개선 사항을 제공합니다.
외부 기여자들에게 감사드리며 이번 릴리스의 전체 변경 내용은 변경 로그에서 확인하실 수 있습니다.
자세한 내용을 살펴보겠습니다.
Gradle 작업을 병렬로 실행하여 빠른 빌드
Kotlin Gradle 플러그인은 이제 프로젝트 내에서 작업을 병렬로 실행할 수 있습니다. 병렬 실행은 Gradle Worker API를 사용하여 지원됩니다. 이 기능을 사용하려면 gradle.properties 또는 local.properties 파일에 다음 설정을 추가하십시오:
kotlin.parallel.tasks.in.project=true
이 기능은 사용자 정의 소스 세트를 정의하는 프로젝트에서 유용합니다. 독립적인 소스 세트의 컴파일은 병렬로 처리할 수 있습니다. 멀티플랫폼 프로젝트의 경우 다른 플랫폼의 대상도 병렬로 빌드할 수 있습니다. Android의 경우 디버그 및 릴리스 빌드 유형을 병렬로 컴파일할 수 있습니다.
나중에 병렬 작업 컴파일을 기본으로 활성화할 계획이므로 문제가 발생하면 피드백을 주시기 바랍니다.
멀티플랫폼 프로젝트 업데이트
멀티플랫폼 프로젝트를 계속 개선하고 사용자 피드백을 기반으로 다양한 측면을 개선하고 있습니다.
Kotlin Gradle DSL 지원
이제 Kotlin Gradle DSL을 사용하여 멀티플랫폼 프로젝트를 빌드할 수 있습니다:
plugins {
kotlin("multiplatform") version "1.3.20"
}
...
kotlin {
...
sourceSets {
val commonMain by getting {
dependencies {
implementation(kotlin("stdlib-common"))
}
}
}
}
문서에서 Groovy 및 Kotlin 양쪽에서 다양한 예제를 확인할 수 있습니다.
DSL 개선 사항
멀티플랫폼 프로젝트를 설정하는 DSL이 크게 개선되고 간소화되었습니다. 이 블로그 게시물에는 이전 버전과 비교하여 몇 가지 하이라이트가 포함되어 있습니다. 자세한 내용 및 완전한 예제를 확인하려면 업데이트된 가이드를 읽어보시기를 권장합니다.
이제 Kotlin 종속성을 위한 단축 표기법을 사용할 수 있습니다. 즉, 'org.jetbrains.kotlin:kotlin-stdlib' 대신에 간단히 'kotlin('stdlib')'를 작성할 수 있습니다.
또한 대상을 직접 지정할 수 있으므로 fromPreset 함수를 사용하지 않아도 됩니다.
// prior
kotlin {
targets {
fromPreset(presets.jvm, 'jvm')
fromPreset(presets.js, 'nodeJs') {
/* additional configuration */
}
}
}
// currently
kotlin {
jvm()
js('nodeJs') { /* additional configuration */ }
// get the existing target:
def theJsTarget = js('nodeJs')
}
필요한 경우 이전 기능을 targetFromPreset(...)을 사용하여 계속 사용할 수 있습니다.
또한 실행 가능한 파일이나 네이티브 라이브러리와 같은 Kotlin/Native 이진 파일을 독립적으로 구성할 수 있습니다. 예를 들어 이를 사용하여 특정 종속성의 심볼을 Objective-C 프레임워크로 내보낼 수 있습니다.
kotlin {
macosX64 {
binaries {
// Produce the framework and export the dependency.
framework {
export(project(":dependency"))
}
}
}
}
더 자세한 정보는 문서를 참조하십시오.
마지막으로, 더 쉬운 컴파일러 구성을 위해 kotlinOptions를 사용할 수 있게 되었습니다.
compilations.all {
kotlinOptions {
freeCompilerArgs = ["-progressive", "-Xskip-metadata-version-check"]
}
}
모든 개선 사항은 Groovy 및 Kotlin DSL에서 모두 사용할 수 있습니다.
멀티플랫폼 라이브러리의 일부로 Android 라이브러리 (AAR) 사용
이제 멀티플랫폼 라이브러리의 일부로 Android 라이브러리 (AAR)를 게시할 수 있습니다. 이 기능은 기본적으로 비활성화되어 있으며 Android 대상의 범위 내에서 게시할 변형 목록을 지정하여 활성화할 수 있습니다.
kotlin {
android {
publishLibraryVariants("release", "debug")
}
}
자세한 내용은 문서를 읽어보십시오.
인라인 클래스 개선 사항
인라인 클래스 지원이 크게 개선되었으며 일부 제약 사항이 완화되었습니다. 예를 들어 이제 인라인 클래스 내에서 내부 클래스를 정의할 수 있습니다. 인라인 클래스 내에서 인라인 함수를 사용하거나 인라인 함수에 대한 인자로 인라인 클래스에 대한 참조를 전달하는 비트리비얼한 경우와 같은 복잡한 경우에도 개선 사항이 있습니다.
또한 인라인 클래스와 함께 리플렉션을 사용하고 클래스 리터럴 및 javaClass 속성에 액세스할 수 있습니다.
inline class Duration(val seconds: Int)
fun test(duration: Duration) {
// the following expressions are translated into class objects for "Duration" class
Duration::class
duration::class
duration.javaClass
assertEquals(duration::class.toString(), "class Duration")
assertEquals(Duration::class.simpleName, "Duration")
}
또한 인라인 클래스 유형을 가진 함수에 대한 call 및 callBy를 지원합니다.
Kotlin/Native
코드 컨트랙트
얼마 전에 컨트랙트를 실험적으로 지원하면 함수가 컴파일러가 이해하는 방식으로 동작을 설명할 수 있습니다. 이 기능은 이제 Kotlin/Native에서도 사용할 수 있습니다.
더 나은 상호 운용성
상속과 관련된 경우와 같은 C 구조물의 더 많은 지원과 함께 더 나은 상호 운용성이 개선되었습니다. 이제 forward declarations와 함께 열거형을 지원하며 Objective-C에서 상속의 경우 더 나은 오류 보고를 지원합니다.
Kotlin 라이브러리에서 네이티브 프레임워크 생성
이번 릴리스에서는 소스 파일뿐만 아니라 Kotlin 라이브러리 (.klib 파일)에서도 Apple 프레임워크를 생성할 수 있습니다. 이는 -Xexport-library 커맨드 라인 옵션 또는 Gradle 플러그인을 사용하여 가능합니다.
성능 개선
메모리 풋프린트를 줄이고 런타임 성능을 개선하는 것 외에도 범위를 반복하는 컴파일러 최적화를 제공하여 반복 속도를 향상시킵니다.
IntelliJ IDEA 지원
이번 릴리스에서는 IntelliJ IDEA 플러그인에 새로운 리팩터링, 검사 및 인텐션 기능이 추가되었습니다. 몇 가지 중요한 개선 사항을 강조해보겠습니다.
매개변수 없는 main 함수를 생성하는 템플릿
Kotlin 1.3부터는 매개변수 없는 main 함수를 사용할 수 있습니다. 이제 기본 'main' 라이브 템플릿이 이 새로운 main 함수를 추가합니다.
이제 필요한 경우 인자를 전달하려면 'maina' 라이브 템플릿을 사용하실 수 있습니다.
코루틴 코드 개선을 위한 검사
코루틴을 사용할 때 일정한 규칙을 따르는 것이 일반적입니다. 예를 들어 'Deferred'를 반환하는 함수에 "Async" 접미사를 추가하거나 함수를 suspend 함수 또는 CoroutineScope의 확장 함수 중 하나로 정의하는 것과 같은 규칙이 있습니다. IntelliJ IDEA는 이러한 규칙을 인식하고 잠재적인 문제를 수정할 수 있는 인텐션을 제공합니다.
SAM을 람다로 변환하는 새로운 의도
새로운 의도를 사용하여 SAM을 사용하는 람다를 익명 객체로 변환할 수 있습니다. 예를 들어 다음과 같은 코드:
val runnable = Runnable {
action()
}
이제 IDE에서 자동으로 다음과 같이 변환될 수 있습니다.
val runnable = object : Runnable {
override fun run() {
action()
}
}
문자열 변환 개선
'문자열 연결을 템플릿으로 변환' 의도가 더 스마트해졌습니다.
class Card(val suit: Any, val value: Any) {
override fun toString(): String = value.toString() + suit.toString()
}
이제 위와 같은 코드가 다음과 같이 변환됩니다.
class Card(val suit: Any, val value: Any) {
override fun toString(): String = "$value$suit"
}
이제 불필요한 .toString() 호출을 각 매개변수에서 제거하면서 코드를 더 간결하게 만들어줍니다.
Kapt 개선
Kapt를 커맨드 라인에서 사용하는 방법이 단순화되어 컴파일러를 통해 사용하는 대신 별도의 커맨드 라인 도구로 직접 사용할 수 있게 되었습니다.
// prior
kotlinc -Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar ...
// currently
kapt ...
kapt 관련된 모든 인수는 이제 verbose 구문 대신 상위 수준 인수로 전달됩니다.
// prior
-P plugin:org.jetbrains.kotlin.kapt3:apclasspath=<classpath>
// currently
-Kapt-classpath=<classpath>
또한 이번 릴리스에서 프로세서 타이밍을 보여주는 새로운 옵션(-Kapt-show-processor-timings)이 도입되었습니다.
Kapt 컴파일 피하기
Gradle에서 KaptKotlin 작업에 대한 컴파일 피하기를 지원합니다. 이로 인해 빌드 성능이 향상됩니다. Kapt 스텁에 변경 사항이 없고 의존성에서 메서드 본문만 변경되었을 때 주석 처리가 완전히 생략됩니다. 이를 활성화하려면 gradle.properties에 다음 설정을 추가하십시오.
kapt.include.compile.classpath=false
그러나 이 설정은 컴파일 클래스 경로에서 AP 검색을 비활성화하므로 주의가 필요합니다. AP를 kapt* 구성에 추가한 경우에는 영향을 미치지 않습니다.
추가 안내 사항
상기 내용 외에도 몇 가지 더 수정 및 개선 사항을 언급할만한 사항이 있습니다:
- Kotlin/JS의 점진적 컴파일은 이제 충분히 안정화되어 기본적으로 활성화되었습니다. 문제가 발생하는 경우에는 알려주시면 감사하겠으며, 그 동안 해당 옵션을 비활성화할 수 있습니다:
- Gradle 프로젝트에서 gradle.properties 또는 local.properties에 kotlin.incremental.js=false를 추가합니다.
- IntelliJ IDEA 프로젝트에서 설정 | 빌드, 실행, 배포 | 컴파일러 | Kotlin 컴파일러 | Kotlin to JavaScript로 이동하고 점진적 컴파일 활성화 옵션을 선택 취소합니다.
- 이제 우리는 org.jetbrains.kotlin 그룹에서 사용하는 종속성을 나열하는 Kotlin BOM (Bill of Materials) 파일을 제공합니다.
- 안정적인 정렬은 이제 모든 대상에서 사용할 수 있습니다. 이전에는 JavaScript를 대상으로 할 때 문제가 있었습니다.
- 스크립팅 지원에서 여러 수정 및 개선 사항이 있습니다.
- JVM 코드 생성에서 MethodHandle 및 VarHandle 지원을 제공합니다.
- Kotlin JVM 라이브러리용 모듈화된 아티팩트가 포함되어 있습니다.
- Gradle 프로젝트의 iOS 프레임워크 대상에 대해 Kotlin/Native는 기본적으로 비트코드를 포함시킵니다.
- Kotlin/Native 어노테이션 @ThreadLocal 및 @SharedImmutable은 이제 공통 코드에서 접근 가능합니다 (optional expect로 선언됨).
어떻게 업데이트해야 하나요
IntelliJ IDEA 또는 Android Studio 플러그인을 업데이트하려면 도구 | Kotlin | Kotlin 플러그인 업데이트 구성을 사용하고 "지금 업데이트 확인" 버튼을 클릭합니다. Eclipse IDE 플러그인은 Eclipse Marketplace (도움말 | Eclipse Marketplace 및 Kotlin 플러그인을 검색)을 통해 설치 또는 업데이트할 수 있습니다.
또한 Maven 및 Gradle 빌드 스크립트에서 컴파일러 및 표준 라이브러리 버전을 업데이트하는 것을 잊지 마십시오. 기존 릴리스에 문제가 발생하는 경우 포럼에서 도움을 요청하거나 Slack (여기에서 초대를 받으실 수 있음)에서 도움을 요청하거나 문제를 보고하십시오.
코틀린을 활용하세요!
외부 기여
이번 릴리스에 대한 모든 커뮤니티 기여에 다시 한 번 감사드립니다. 특히:
- Kenji Tomita
- Xavi Arias Seguí
- Ivan Gavrilovic
- Cuihtlauac Alvarado
- Matthew Runo
- Takayuki Matsubara
- Ting-Yuan Huang
- Vitaly Khudobakhshov
- Aleksei Semin
- Alex Saveau
- Bernhard Posselt
- Corey
- Dave Leeds
- Bradley Smith
- Fabian Mastenbroek
- Fedor Korotkov
- Ingo Kegel
- Itsuki Aoyagi
- James Wald
- John Eismeier
- Juan Chen
- Karen Schwane
- Keita Watanabe
- Lukas Welte
- Mikhail Levchenko
- Monchi
- Piotr Krzeminski
- Raluca Sauciuc
- Ricardo Meneghin Filho
- Timo Obereder
- Yuki Miida
- shiraji
- takattata
- technoir
- ymnder
업데이트
이전에는 Gradle에서 병렬 빌드를 활성화해야 한다고 언급했습니다.
org.gradle.parallel=true
실제로는 이것이 필요하지 않습니다. 이것은 프로젝트 간 병렬성을 활성화하는 것이므로 이에 대해 지적해 주신 Cédric Champeau와 Eric Wendelin에게 감사드립니다.
원문
https://blog.jetbrains.com/kotlin/2019/01/kotlin-1-3-20-released/
댓글