我們很高興地宣佈Kotlin 1.3.40正式版在今天釋出! 除了常規的質量及工具改進外,這個版本更應該去關注下面這幾點:
- 為Kotlin/JS提供NPM,Yarn和Webpack的Gradle支援
- 改進了多平臺專案的測試執行器
- 新的型別推斷
- Kotlin/Native效能和互操作性的改進
同時,新的函式以實驗的形式加入到了標準庫中
你可以在更新日誌中檢視完整的列表。我們一如既往地感謝這些貢獻者。
下面將為你展示這次的更新內容。
標準庫中的實驗函式
我們往標準庫裡引入了幾個實驗性質的函式。都是用於將位元組或字元陣列編/解碼為UTF-8編碼字串的常用函式,包括:
ByteArray.decodeToString
和String.encodeToByteArray
CharArray.concatToString
和String.toCharArray
另一個實驗性函式capitalize
被新增到JVM上,它以Locale
物件作為引數。
它們都不是預設可用的,可以通過註解@UseExperimental(ExperimentalStdlibApi::class)
或在編譯器中指定配置項-Xuse-experimental=kotlin.ExperimentalStdlibApi
來使用新增的實驗性函式。
這個版本中引入的 ExperimentalStdlibApi
註解,用以註明那些實驗性質的API。這些API的行為會根據使用者的反饋進行調整,因此並不承諾其相容性。你可以在該 文件中獲取有關實驗性註解的更多資訊。
在JVM上通過反射訪問reified型別
該正式版本新增的另一個實驗性函式是typeOf
。如你所見,其能為指定的型別構造一個KType
例項:
在需要獲取泛型的型別資訊時,就能體會到好處了。當你對一個已確定型別的泛型T
呼叫typeOf()
,typeOf
會返回該泛型的實際型別:
目前來說,typeOf
只能用於Kotlin/JVM平臺上,但在未來的版本中,會有類似的函式登陸其他平臺:Kotlin/JS和Kotlin/Native。
對於trimIndent和trimMargin的優化
為了更好的程式碼排版,通常橫跨多行的字串會伴隨著trimIndent
或trimMargin
方法的呼叫。從該正式版開始,編譯器將會優化trimIndent
和trimMargin
的呼叫。這並非只是依賴庫函式,而是編譯器在位元組碼中直接生成經過修剪的字串:
目標平臺:執行kotlin v. 1.3.40的JVM
請注意該優化只會針對字串常量表示式,並不適用於字串模版(例如"$x"
)。
minBy
和maxBy
函式也得到優化,當其呼叫者集合只包含一個元素時,不再呼叫指定的selector
函式。如果你依賴於selector
函式帶來的副作用,請留意該優化的影響。
在IntelliJ IDEA上使用第三方註解
如果你用到了Java的第三方空檢查註解,IDE現在會對Kotlin中帶該註解Java方法的錯誤呼叫進行警告了。
想象一下你的Java方法標記了第三方的註解。IDEA可以正常顯示該註解,但它實際並不存在於程式碼之中。
該註解會被宣告在獨立的annotations.xml
檔案中:
1 2 3 4 5 |
<root> <item name="JavaClass java.lang.String nullableString()"> <annotation name="org.jetbrains.annotations.Nullable"/> </item> </root> |
從該版本開始,Kotlin中Java方法的錯誤呼叫會被標記為warning:
注意這只是純粹的IDE功能,Kotlin編譯器會忽略警告去編譯相關的程式碼。nullableString(可空的字串)
仍然會被編譯器推斷為平臺相關型別的String!(不可空的字串)
,只是IDE會有額外的warning提醒。
新的型別推斷演算法
我們一直致力於完善型別推斷演算法,修復了不同的邊界問題以滿足各種各樣的場合: 完整的問題修復列表讓人激動萬分。在Kotlin的未來版本,新演算法將會取代舊演算法成為預設演算法。
我們非常關心替換新演算法的向後相容性。因此我們在當前版本中僅對IDE預設開啟了該演算法,以便收集實際使用中的反饋。 請注意可能出現程式碼在IDE中沒有異常但卻無法通過編譯器的情況,這是因為修正了複雜的邊界bug導致的。如果你看到如程式碼在IDE被標紅但卻能通過編譯或反之亦然的不一致情況,請向我們提交issue。如果該模式導致你的專案無法正常執行,在Preferences裡的Kotlin Compiler頁下取消勾選Enable new type inference algorithm for IDE analysis
即可(Android Studio下該選項位於其他位置:Preferences | Kotlin Compiler)。
我們期待你的反饋!
多平臺專案 (MPP)
Kotlin/Native和Kotlin/JS的測試執行器現在實現了Gradle Test執行器的所有API,其執行方式近似於Kotlin/JVM測試執行器。控制檯會列印帶導航的原始碼錯誤報告。同時Gradle也會生成測試報告。通過標準的Gradle引數支援傳遞測試過濾引數,例如: --tests some.test.ClassName
。
可以通過Gradle生成一份完整的測試執行報告,包含所有目標平臺上的資訊,這些平臺包括:Kotlin/Native,Kotlin/JS和Kotlin/JVM。
Kotlin/JS
Kotlin/JS的增量編譯效能得到了提升。特別在某些大型專案 和/或 模組有大量依賴的情況下,其編譯較之前縮短了多達30%的時間。
該版本中Kotlin/JS最顯著的變化來自工具方面。我們很高興地介紹Gradle上已經更新的Kotlin/JS外掛,我們將其重新命名為org.jetbrains.kotlin.js
,現在可以在Gradle plugin portal上獲取。只需要在build.gradle
中通過plugins {}
語法啟用即可:
1 2 3 4 5 |
[kotlin] plugins { id("org.jetbrains.kotlin.js") version "1.3.40" } [/kotlin] |
或者在build.gradle.kts
檔案中呼叫kotlin
函式:
1 2 3 4 5 |
[kotlin] plugins { kotlin("js") version "1.3.40" } [/kotlin] |
我們正在努力將kotlin-frontend-plugin外掛的所有功能移植到Kotlin/JS外掛和Kotlin/Multiplatform外掛中。部分功能已經在測試中。我們計劃在這項工作完成後棄用kotlin-frontend-plugin
。
對NPM和Webpack的實驗支援
今天,我們很高興與你分享一些實驗性功能,以幫助簡化採用Node.js,NPM,Yarn或Webpack的JavaScript專案開發。我們在Kotlin/JS和Multiplatform Gradle外掛中新增了一些輔助任務,以簡化整合。該外掛將為你的專案生成一個臨時的package.json
,它將下載並使用Yarn自動管理NPM依賴項和node_modules
。 Webpack將在後臺啟動,以加入所有依賴項,並根據你的程式碼建立瀏覽器友好的指令碼。
該外掛會將Gradle專案中宣告的所有Kotlin/JS依賴項附加到自動維護的node_modules
資料夾中。現在,JS SourceSet的dependencies {}
塊中新新增的npm
函式可以在Gradle指令碼新增NPM依賴項:
1 2 3 4 5 |
[kotlin] dependencies { implementation(npm("react", "16.8.3")) } [/kotlin] |
Yarn Workspaces用於多平臺專案的Gradle構建。每個子專案會建立一個工作目錄,並在根專案的目錄下進行配置。這允許Yarn通過提取對根node_modules
的公共依賴來減少子專案中的node_modules
副本。
Node.js和瀏覽器模式
JavaScript專案的執行和測試始終取決於環境。我們已經新增了對Node.js和瀏覽器執行環境的支援。你可以使用nodejs {}
或browser {}
函式為Kotlin/JS和Multiplatform Gradle外掛配置Kotlin。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[kotlin] kotlin { //use js() for a multiplatform project target { nodejs() browser() } sourceSets["main"].dependencies { implementation(kotlin("stdlib-js")) implementation(npm("react", "16.8.3")) } } [/kotlin] |
該Gradle外掛會下載並安裝(當然是通過Yarn) 所有必要的NPM依賴,包括用於Karma測試的無UI瀏覽器,去測試你的程式碼。Mocha測試框架將用於在Node.js環境中執行測試。測試執行器與Gradle整合,並實現與Kotlin/JVM測試類似的功能。例如,測試失敗將顯示在控制檯中,會生成測試報告,Gradle命令列能接收測試過濾器。
有時很難追溯並改善程式碼中的錯誤,因此我們在Gradle外掛中為所有的這些任務新增了JavaScript原始碼對映的支援。
你可以輕鬆地配置適合在不同瀏覽器中執行的瀏覽器測試。外掛為Karma測試執行器配置好NPM依賴項,並使其運作起來。Gradle中可能會用到以下的DSL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[kotlin] kotlin { //use js() for multiplatform project target { browser { testTask { useKarma { useIe() useSafari() useFirefox() useChrome() useChromeCanary() useChromeHeadless() usePhantomJS() useOpera() } } } } } [/kotlin] |
會在Gradle外掛中新增了一個run
任務,用於在Node.js或Browser環境中執行Kotlin/JS程式碼。
注意,新的Kotlin/JS構建功能是實驗性的,目前僅支援macOS和Linux。 Windows的支援將在稍後新增。
Kotlin/Native
在記憶體管理器中包含了一些改進以提高Kotlin/Native應用程式的效能。我們從基準測試中觀察到效能提升了將近兩倍。
為Linux新增了ARM x64(ARM / AArch64)的支援。 CoreLocation
框架是預載入並已包含在macOS上。我們改進了Kotlin/Native編譯器對日誌記錄和錯誤訊息的顯示。
FreezableAtomicReference
是Kotlin/Native中包含的新實驗性類,用於幫助處理多執行緒和併發。它的作用類似於“AtomicReference”類,而不論它是否被凍結。
kotlin-platform-native
已被棄用。請遷移到kotlin-multiplatform
Gradle外掛。檢視文件以瞭解遷移指南和更多資訊。
我們還刪除了kotlin-multiplatform
Gradle外掛中之前被棄用的用以配置Kotlin/Native的API。從1.3.40開始,不再支援compilations.outputKinds
,請使用binaries
API。
互操作性
該版本已包含對Kotlin/Native生成的框架的實驗性泛型支援。它將通用引數的型別資訊新增到Objective-C/Swift生成的Kotlin/Native泛型類中。該功能預設是關閉的,要啟用它,將-Xobjc-generics
作為命令列引數傳遞給編譯器,或將這堆東西新增到Gradle專案配置中:
1 2 3 4 5 6 7 8 9 10 11 |
[kotlin] kotlin { iosX64 { binaries { framework { freeCompilerArgs.add("-Xobjc-generics") } } } } [/kotlin] |
In addition to this, the Kotlin type Unit
will turn into Void
in the produced frameworks. Kotlin/Native method names will not clash with Objective-C declarations, because we’ve improved the way method names are generated. Variadic Objective-C functions are now supported in the interop.
現在和C的互操作中已支援可空的字串了。我們使用自定義的異常鉤子修復了該問題;現在,你可以在程式碼中使用setUnhandledExceptionHook {}
函式來捕獲未被處理的Kotlin異常。
Kotlin/Native中的測試
我們為Kotlin/Native測試新增了一個單獨的二進位制型別。現在更容易指引build去建立Native的測試可執行檔案:
1 2 3 4 5 6 7 8 9 |
[kotlin] kotlin.macosX64 { binaries { test("integration") { /* configuration if needed */ } } } [/kotlin] |
Kotlin/Native測試執行器現在已與Gradle整合,並實現了類似於Kotlin/JVM上測試執行器的功能,例如,控制檯會顯示測試失敗,並生成測試報告,同時你可以將測試過濾器傳遞給Gradle命令列。
現在,使用binaries.getTest
函式通過Gradle API獲取測試二進位制檔案更加容易。而查詢測試可執行檔案的舊方法,例如`binaries.getExecutable(“test”,“DEBUG”)
將不再有用,請使用新的API:binaries.getTest(“DEBUG”)
。
如何升級
像往常一樣,你可以在play.kotl.in上線上體驗Kotlin
- 對於Maven, Gradle, 和npm:配置編譯器及標準庫的版本為
1.3.40
請參考文件. - 對於IntelliJ IDEA 和Android Studio:要將Kotlin升級到1.3.40。開啟Tools | Kotlin | Configure Kotlin Plugin Updates並點選“Check for updates now” 按鈕。
- 對於Eclipse:在Marketplace安裝Kotlin外掛。
- 對於命令列編譯器 在Github release page可以下載獲取。
如果你在新版本遇到任何問題,歡迎在Slack上的論壇上尋求幫助(這裡獲取邀請),或在問題跟蹤器提交問題。
請盡情享受Kotlin!
其餘貢獻者
我們特別感謝Kevin Galligan他的貢獻adding support of generics in Kotlin/Native produced frameworks.
我們非常感謝提交了PR並被合併到該正式版中的其他貢獻者:
- Dimach
- Toshiaki Kameyama
- pyos
- Mark Punzalan
- Ivan Gavrilovic
- Ting-Yuan Huang
- Steven Schäfer
- Burak Eregar
- Dereck Bridie
- Jake Wharton
- Mads Ager
- Kirill Knize
- gcx11
- Austaon
- Ryan
- Jan Gerling
- Harry Billinis
- Georgios Andrianakis
- George Gastaldi
- Eduard Wolf
- Caleb Brinkman
- Wil
- Benjamin Orsini
- Yanis Batura
- ilgonmic
- Kenji Tomita
- Matthew Runo
- Kirill Rakhman
- Kevin Galligan
- Kevin Peek
- Kerooker
- Juan Chen
- Nikolay Kasyanov
- Jorge Antonio Díaz-Benito Soriano
- Pavel Nikitin
- Peter Xu
- Rene Groeschke
- Jiaxiang Chen