Kotlin 1.3.20正式发布

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指正这一点。

 

此条目发表在官方博客分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注