Kotlin 1.3.20的正式版終於來了,是1.3的bug及功能性更新的”補丁”。除了編譯器及IDE的改進以外,該版本包括以下內容:
- 允許在單個專案裡並行執行Gradle任務
- 允許通過Gradle Kotlin DSL構建多平臺專案
- 針對內聯類的改進
- 針對Kapt推出的獨立命令列工具
- Kotlin / JS預設啟用增量編譯
- 針對Kotlin / Native的改進
一如既往,我們要感謝眾多的貢獻者。完整的更新列表可以在更新日誌中檢視。下面有請!
通過並行任務來構建更快的Gradle
Kotlin Gradle外掛現在可以在專案中並行執行任務。而Gradle Worker API支援並行執行。將以下配置新增到gradle.properties
或local.properties
檔案中以啟動該功能:
1 2 |
kotlin.parallel.tasks.in.project=true |
這個功能對於自定義了原始檔路徑的專案非常有用,原本獨立的源路徑都支援並行編譯了。 對於多平臺專案,也可以對不同目標平臺並行構建。 而Android,debug和release的編譯任務可以並行執行。
我們計劃在之後預設啟用並行任務編譯,因此我們期待你的反饋。請盡情告訴我們你所遇到的所有問題。
多平臺專案的更新
我們將繼續致力於多平臺專案,並根據你的反饋進行改進。
Kotlin Gradle DSL的支援
你現在可以如下一樣使用Kotlin Gradle DSL構建多平臺專案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
plugins { kotlin("multiplatform") version "1.3.20" } ... kotlin { ... sourceSets { val commonMain by getting { dependencies { implementation(kotlin("stdlib-common")) } } } |
你可以在該文件檢視Groovy和Kotlin的示例。
DSL的改進
該版本極大地改善和簡化了DSL構建多平臺專案的操作。這篇部落格展示了部分值得關注的更新點。我們強烈建議你閱讀這篇更新指南瞭解更多的細節和例子。
你現在可以使用簡寫去依賴Kotlin。也就是說,你只需要寫kotlin(’stdlib’),而不是org.jetbrains.kotlin:kotlin-stdlib
。
此外,可以直接指定所支援的目標平臺,去代替fromPreset函式:
1 2 3 4 5 6 7 8 9 10 |
// 在此之前 kotlin { targets { fromPreset(presets.jvm, 'jvm') fromPreset(presets.js, 'nodeJs') { /* additional configuration */ } } } |
1 2 3 4 5 6 7 8 9 |
// 現在 kotlin { jvm() js('nodeJs') { /* additional configuration */ } // get the existing target: def theJsTarget = js('nodeJs') } |
如果你仍然需要以前的功能,可以使用targetFromPreset(...)
。
你還可以像可執行檔案或本地庫一樣獨立配置Kotlin / Native的二進位制檔案。舉個例子,你可以將某些依賴項的符號匯出到Objective-C框架。
1 2 3 4 5 6 7 8 9 10 11 |
kotlin { macosX64 { binaries { // Produce the framework and export the dependency. framework { export(project(":dependency")) } } } } |
更多資訊請查閱文件。
最後, kotlinOptions
讓編譯配置更加簡單。
以上改進都包含於Groovy和Kotlin DSL之中了。
Android Library(AAR)終於可以作為多平臺庫的一分子了
你現在可以將Android Library(AAR)作為多平臺庫的一部分發布。該功能預設情況下是禁用的,若要啟用,請指定你要釋出的目標版本:
1 2 3 4 5 6 |
kotlin { android { publishLibraryVariants("release", "debug") } } |
關於釋出庫的更多內容請參見文件。
內聯類的改進
內聯類的相關支援已經有顯著的改進,很多限制也被放鬆了。 例如,現在允許在內聯類中定義內部類。 對於一些特殊的使用情景也有所完善,例如在內聯類中使用行內函數,或將對內聯類的引用作為引數傳遞給行內函數。
你甚至還能將反射與內聯類結合使用,並且可以訪問類字面常量和javaClass
屬性
1 2 3 4 5 6 7 8 9 10 11 12 |
inline class Duration(val seconds: Int) fun test(duration: Duration) { // 下面的語句將被翻譯為Duration類的類物件 Duration::class duration::class duration.javaClass assertEquals(duration::class.toString(), "class Duration") assertEquals(Duration::class.simpleName, "Duration") } |
還支援對在簽名中有內聯類型別的函式進行call
和callBy
的呼叫。更多資訊請參閱KEEP上的相應部分。
Kotlin/Native
程式碼契約
之前我們引入了對契約的實驗性支援,它允許函式以編譯器理解的方式描述其行為。現在Kotlin/Native中也能使用該功能。
更好的互操作性
互操作性得到加強以支援更多的C結構,例如enums with forward declarations,以及用於Objective-C的繼承時能有更好的錯誤提示。
從庫中生成框架
在該版本中,我們不僅可以從原始檔生成Apple框架,還可以從Kotlin庫(即.klib
檔案)生成Apple框架。這可以使用-Xexport-library
命令列選項或Gradle外掛實現。
效能
除了減少記憶體佔用並提高執行時效能之外,此版本還為範圍遍歷帶來了編譯器優化,使迭代速度更快。
IntelliJ IDEA的支援
該版本為IntelliJ IDEA外掛新增了新的重構,檢查和意圖。我們重點介紹其中的一部分。
生成沒有引數main
函式的模板
從Kotlin 1.3開始,你可以使用不帶引數的main
函式。現在,預設的main
模版也允許生成無參main
函式了。
如果你需要傳遞帶引數,請使用maina
模板。
檢查以改進協程程式碼
一般遵循某種約定來編寫協程程式碼。 例如,你可以為返回Deferred
的函式新增Async
字尾,或者將函式定義為suspend
函式或作為CoroutineScope
的擴充套件函式,但不能同時定義兩者(更多詳細資訊參考來自KotlinConf的演講)。 IntelliJ IDEA現在瞭解這些習慣用法,並提供修復潛在問題的意圖:
將lambda SAM轉換為匿名物件的新意圖
新意圖允許將以lambda寫成的SAM轉換為匿名物件。例如:
1 2 3 4 |
val runnable = Runnable { action() } |
將由IDE自動轉換為
1 2 3 4 5 6 |
val runnable = object : Runnable { override fun run() { action() } } |
字串轉換的改進
Convert concatenation to template
意圖將更加聰明,意味著
1 2 3 4 |
class Card(val suit: Any, val value: Any) { override fun toString(): String = value.toString() + suit.toString() } |
將被轉換為
1 2 3 4 |
class Card(val suit: Any, val value: Any) { override fun toString(): String = "$value$suit" } |
各個變數的非必須 .toString()
方法都被移除了。
Kapt的改進
從命令列使用Kapt將更為簡單,允許直接將其用作單獨的命令列工具,而無需通過編譯器去使用:
1 2 3 4 5 6 |
// 在此之前 kotlinc -Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar ... // 現在 kapt ... |
所有與kapt相關的引數都將作為頂級引數傳遞,而不需按完整語法編寫:
1 2 3 4 5 6 |
// 在此之前 -P plugin:org.jetbrains.kotlin.kapt3:apclasspath=<classpath> // 現在 -Kapt-classpath=<classpath> |
請注意,該版本中還引入了一個顯示處理器時序的新選項(-Kapt-show-processor-timings
)
跳過Kapt編譯
我們在Gradle中為kaptKotlin
任務增加了對Compile Avoidance的支援,從而提高了構建速度。 當kapt快取沒有發生更改並且只有方法體在依賴關係中發生變動時,它會跳過其編譯。如下設定
1 2 |
kapt.include.compile.classpath=false |
在gradle.properties
中啟用。但請注意,該設定還會關閉編譯類路徑中的AP發現,但如果將AP新增到kapt *
配置,則不會對你有任何影響。
其他值得注意的
除了上述內容之外,還有一些值得一提的修復和改進:
- Kotlin/JS的增量編譯已經足夠穩定了,且預設啟用。 如果你遇到任何問題,非常歡迎並感謝你的反饋,同時你可以禁用該選項:
- 在Gradle專案中,將
kotlin.incremental.js = false
新增到gradle.properties
或local.properties
檔案裡 - 在IntelliJ IDEA專案中,開啟Settings | Build, Execution, Deployment | Compiler | Kotlin Compiler | Kotlin to JavaScript並取消Enable incremental compilation的勾選。
- 在Gradle專案中,將
- 我們現在提供Kotlin BOM(清單)檔案,羅列了
org.jetbrains.kotlin
的依賴關係。 - 現在所有平臺上的排序都穩定了。在此之前,在JavaScript上存在部分問題。
- 針對指令碼的眾多修復和改進。
- 現在支援在JVM程式碼中生成MethodHandle and VarHandle。
- 已包含模組化的Kotlin的JVM庫。
- 對於Gradle中的以iOS框架為目標的專案,Kotlin/Native將預設嵌入bitcode。
- 現在公共程式碼可以訪問Kotlin/Native的註釋
@ThreadLocal
和@SharedImmutable
(被宣告為optional expect
)。
如何升級
要更新IntelliJ IDEA或Android Studio外掛,請選擇Tools | Kotlin | Configure Kotlin Plugin Updates,然後單擊“Check for updates now”按鈕。 而Eclipse外掛則需要通過[Eclipse Marketplace](http://marketplace.eclipse.org/content/kotlin-plugin-eclipse)(Help | Eclipse Marketplace並搜尋Kotlin外掛)安裝或更新
另外,不要忘記更新Maven和Gradle構建指令碼中的編譯器和標準庫版本。 同樣,如果你在新版本中遇到任何問題,歡迎到論壇上尋求幫助,在Slack(在此處獲得邀請)或在問題跟蹤器中報告。
請盡情享受Kotlin!
外部貢獻
再次感謝本次釋出的所有來自社群的貢獻。特別是:
- 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中啟用並行構建是有必要的
1 2 |
org.gradle.parallel=true |
事實上這不是必需的,因為這將同時開啟cross-project parallelism
。感謝CédricChampeau和Eric Wendelin指正這一點。