Kotlin 1.3.20正式釋出

kotliner發表於2019-02-12

Kotlin 1.3.20的正式版終於來了,是1.3的bug及功能性更新的”補丁”。除了編譯器及IDE的改進以外,該版本包括以下內容:

  • 允許在單個專案裡並行執行Gradle任務
  • 允許通過Gradle Kotlin DSL構建多平臺專案
  • 針對內聯類的改進
  • 針對Kapt推出的獨立命令列工具
  • Kotlin / JS預設啟用增量編譯
  • 針對Kotlin / Native的改進


一如既往,我們要感謝眾多的貢獻者。完整的更新列表可以在更新日誌中檢視。下面有請!

通過並行任務來構建更快的Gradle

Kotlin Gradle外掛現在可以在專案中並行執行任務。而Gradle Worker API支援並行執行。將以下配置新增到gradle.propertieslocal.properties檔案中以啟動該功能:

這個功能對於自定義了原始檔路徑的專案非常有用,原本獨立的源路徑都支援並行編譯了。 對於多平臺專案,也可以對不同目標平臺並行構建。 而Android,debug和release的編譯任務可以並行執行。

我們計劃在之後預設啟用並行任務編譯,因此我們期待你的反饋。請盡情告訴我們你所遇到的所有問題。

多平臺專案的更新

我們將繼續致力於多平臺專案,並根據你的反饋進行改進。

 

Kotlin Gradle DSL的支援

你現在可以如下一樣使用Kotlin Gradle DSL構建多平臺專案:

你可以在該文件檢視Groovy和Kotlin的示例。

DSL的改進

該版本極大地改善和簡化了DSL構建多平臺專案的操作。這篇部落格展示了部分值得關注的更新點。我們強烈建議你閱讀這篇更新指南瞭解更多的細節和例子。

你現在可以使用簡寫去依賴Kotlin。也就是說,你只需要寫kotlin(’stdlib’),而不是org.jetbrains.kotlin:kotlin-stdlib

此外,可以直接指定所支援的目標平臺,去代替fromPreset函式:

如果你仍然需要以前的功能,可以使用targetFromPreset(...)

你還可以像可執行檔案或本地庫一樣獨立配置Kotlin / Native的二進位制檔案。舉個例子,你可以將某些依賴項的符號匯出到Objective-C框架。

更多資訊請查閱文件

最後, kotlinOptions讓編譯配置更加簡單。

以上改進都包含於Groovy和Kotlin DSL之中了。

Android Library(AAR)終於可以作為多平臺庫的一分子了

你現在可以將Android Library(AAR)作為多平臺庫的一部分發布。該功能預設情況下是禁用的,若要啟用,請指定你要釋出的目標版本:

關於釋出庫的更多內容請參見文件

內聯類的改進

內聯類的相關支援已經有顯著的改進,很多限制也被放鬆了。 例如,現在允許在內聯類中定義內部類。 對於一些特殊的使用情景也有所完善,例如在內聯類中使用行內函數,或將對內聯類的引用作為引數傳遞給行內函數。

你甚至還能將反射與內聯類結合使用,並且可以訪問類字面常量和javaClass屬性

還支援對在簽名中有內聯類型別的函式進行callcallBy的呼叫。更多資訊請參閱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轉換為匿名物件。例如:

將由IDE自動轉換為

字串轉換的改進

Convert concatenation to template意圖將更加聰明,意味著

將被轉換為

各個變數的非必須 .toString() 方法都被移除了。

Kapt的改進

從命令列使用Kapt將更為簡單,允許直接將其用作單獨的命令列工具,而無需通過編譯器去使用:

所有與kapt相關的引數都將作為頂級引數傳遞,而不需按完整語法編寫:

請注意,該版本中還引入了一個顯示處理器時序的新選項(-Kapt-show-processor-timings

跳過Kapt編譯

我們在Gradle中為kaptKotlin任務增加了對Compile Avoidance的支援,從而提高了構建速度。 當kapt快取沒有發生更改並且只有方法體在依賴關係中發生變動時,它會跳過其編譯。如下設定

gradle.properties中啟用。但請注意,該設定還會關閉編譯類路徑中的AP發現,但如果將AP新增到kapt *配置,則不會對你有任何影響。

其他值得注意的

除了上述內容之外,還有一些值得一提的修復和改進:

  • Kotlin/JS的增量編譯已經足夠穩定了,且預設啟用。 如果你遇到任何問題,非常歡迎並感謝你的反饋,同時你可以禁用該選項:
    • 在Gradle專案中,將kotlin.incremental.js = false新增到gradle.propertieslocal.properties檔案裡
    • 在IntelliJ IDEA專案中,開啟Settings | Build, Execution, Deployment | Compiler | Kotlin Compiler | Kotlin to JavaScript並取消Enable incremental compilation的勾選。
  • 我們現在提供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!

外部貢獻

再次感謝本次釋出的所有來自社群的貢獻。特別是:

補充

我們之前曾提過Gradle中啟用並行構建是有必要的

事實上這不是必需的,因為這將同時開啟cross-project parallelism。感謝CédricChampeau和Eric Wendelin指正這一點。

 

相關文章