改进IDE对* .gradle.kts的支持

我们已显著改善了IDE对Gradle Kotlin DSL脚本(* .gradle.kts文件)的支持,并希望在此博客中与你分享详细的信息。这些更改将在Kotlin 1.3.70版本中体现,但你可以通过加入Kotlin 1.3.70 EAP(早期访问计划)来尝鲜。

你可能遇到过以下情况。你有一个使用Gradle Kotlin DSL脚本构建的项目,并打开build.gradle.kts文件去修改项目的构建逻辑,但是突然计算机的CPU仿佛抽风了,你的脚本看起来像纯文本(没有高亮),并且编写脚本时也没有智能提示。同时,首次打开脚本需要最多10秒代码才会高亮。

而现在若你打开的脚本来自导入过的Gradle项目,那么IDE会立即高亮该脚本!

img

除此以外,我们设法加快了脚本的高亮和解析过程,这在大型项目中体验尤为明显。现在,跨多个文件使用各种IDE功能(例如buildSrc中的“找出所有引用”)应该可以更快地工作了。

img

确保你更新到了以下版本,以享受更多新的改进:

  • Gradle version 6.0+
  • IntelliJ IDEA version 2019.2+
  • Kotlin plugin version 1.3.70+

如果使用默认项目向导创建新项目,则可以通过运行gradle wrapper --gradle-version=6.2来更新Gradle版本。从2020.1开始,IntelliJ IDEA将自动使用Gradle 6.0+版本创建项目。

请注意,如果你在旧版本Gradle或旧版本IntelliJ IDEA上使用最新的Kotlin插件,则脚本支持仍将以较慢的旧方式工作。

现在,我们想分享一些有关如何实现这一目标的技术细节。我们将讨论此前IDE是如何工作以及发生了什么变化。

脚本配置

Gradle Kotlin DSL脚本包含常规的Kotlin代码,这意味着所有Kotlin文件都具有代码智能提醒功能。例如,你可以导航到每一个使用过的函数调用声明,并可以通过代码补全根据当前上下文中查看可用的选项。但是,脚本文件与常规Kotlin文件不同,脚本文件可以指定依赖项和应用的Gradle插件,这会影响脚本本身的解析。

例如,将应用程序插件 应用于脚本时,后续可以使用application进行配置:

显然,你必须先应用相应的插件才能使用application的功能。脚本内部具有的这种依赖性使得IDE对脚本文件的支持不同于对常规Kotlin文件的支持,而且更加复杂。

解析脚本文件所需的所有信息都称为脚本配置。脚本配置主要取决于脚本的buildscriptplugins部分的内容。它包含诸如可在脚本中使用的库以及默认导入之类的信息。 IDE使用脚本配置为脚本文件提供代码提示,例如高亮,补全,导航和重构。

有关脚本配置的更多详细技术信息,请参阅脚本支持的KEEP文档

重新设计与Gradle守护程序的交互

对于Gradle脚本,最新的脚本配置由Gradle守护进程负责管理,该进程在后台运行,并负责所有与Gradle相关的任务和活动。为了更新脚本配置,IDE代码向Gradle守护程序发送一个负责执行配置构建的请求,然后Gradle守护程序提供最新的配置。

在Kotlin 1.3.70以前的版本,由于Gradle和IntelliJ平台都缺少更好的API,因此脚本发生的变动都会请求并更新脚本配置。这就是构建速度慢的原因。

从Kotlin 1.3.70开始,我们重新设计了Gradle守护程序请求脚本配置的整个机制。现在脚本配置会在第一次导入Gradle项目时执行,然后保存在IDE。当你修改buildscriptplugins部分时,将再次执行请求。我们计划引入Load Script Configurations操作(稍后会详细介绍),从而避免在脚本更改时自动执行请求。

得益于新的Gradle TAPI(可以在单个请求中获取所有脚本配置)(感谢Gradle团队),以及新的IntelliJ IDEA API(可以在项目导入期间向Gradle请求其他信息),从而实现了这一改进(感谢Vlad Soroka)。

请注意,我们预计“项目导入”不会产生额外的开销。 Gradle在“项目配置”阶段会编译所有脚本,因此Gradle中已经存在所有必要的信息。只添加了检索的新方案。

未来的计划

更好的错误报告

新的Gradle API让改进更进一步成为可能,并且可以提供更好的错误报告。你可能看过以下消息:“This script caused build configuration to fail… Show Kotlin Gradle DSL Logs in Finder/Explorer”。你只能在Gradle守护程序输出的独立的日志文件中查看错误。但现在,Gradle守护程序将直接返回有关错误的所有信息,并且将像其他信息一样在build窗口中展示。

明确的“加载脚本配置”操作

如上所述,为了获得更好的性能,我们将不再自动执行更新脚本配置的请求。在Kotlin 1.3.60中,添加新插件后,如上示例中的application,开始你需要等待一段时间,直到新的脚本配置加载成功。加载会在后台自动进行,因此加载时你会收到通知以应用更改。你可能已经看到过这样的消息:“There’s a new script context available. Apply context”(“script context”现在称为“Script Configuration”)。应用后,你可以立即使用application的功能,这得益于已加载的脚本配置,其功能可以被顺利解析。

我们计划删除在buildscriptplugin部分改动后对Gradle Daemon的请求:你需要在添加新插件后显式加载新的脚本配置。在IntelliJ IDEA 2019.2中,你将使用标准的“Import Gradle Project”来执行相关操作。从IntelliJ IDEA 2020.1开始,我们将有一个体验更加友好的“Load Gradle Changes”操作,其作用相同:它会加载Gradle项目结构的所有更改。

我们还计划引入另一种操作,该操作可用于仅加载对脚本配置的更改,而无需更新整个项目。我们希望它具有以下工作流程:

  1. 你添加了插件 (例如application).
  2. IDE注意到相应脚本的更改可能会影响脚本配置,并建议加载(仍然由Gradle守护程序进行加载)。你会看到“Load Script Configurations”操作,但是在你手动执行之前,不会向Gradle守护程序的发送任何请求。
  3. 仅在单击此操作或完整的“ Load Gradle Changes”操作后,更改才被加载,同时你可以获得新添加插件的代码提示了,例如,你可以在脚本中使用代码补全application的函数。

我们尚未实施这些更新,但排期将至。这意味着还有时间向我们反馈。所描述的工作流程和新的“Load Script Configuration”操作是否足够清晰?我们想知道你的想法!

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

1 则回应给 改进IDE对* .gradle.kts的支持

  1. Pingback引用通告: Kotlin 1.3.70正式发布 - KotlinCn

发表评论

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