IntelliJ IDEA Tips & Tricks

IntelliJ IDEA 中 Gradle 委托流程的历史

Read this post in other languages:

如今,构建工具是一切项目的重要组成部分,而 IntelliJ IDEA 已与大多数构建工具集成。 最流行的构建工具之一是 Gradle

我们想简要介绍一下它与 IntelliJ IDEA 的集成历史以及 IDE 内实现的委托流程。

起点

IntelliJ IDEA 的上市时间比其他构建工具都要早,多年来一直提供其原生构建系统并取得了巨大成功。 IntelliJ IDEA 构建系统始终是编译、运行测试和打包到 JAR 等任务的最佳选择。

开发者通常主要关注编译和运行测试,因此构建流程的快速反馈周期至关重要,而我们则擅长执行 JUnit 和 TestNG 测试以及增量编译。

Gradle 之前

Maven 推出时表现出强大的项目依赖项管理能力,我们利用了它的项目结构,并将下载和解析依赖项委托给 Maven(但将构建流程留给 IntelliJ IDEA)。

我们能够在 IntelliJ IDEA 构建系统中复制 Maven 的构建流程。 基于 Maven 项目模型,IntelliJ IDEA 可以用最少的额外步骤构建项目。 同时,我们开发了有效检索资源处理信息的机制,覆盖从 pom.xml 生成 MANIFEST.mf 文件,进一步增强了构建流程。

然后,我们将构建流程的结果应用到执行测试的原生流程。

借助这项改进,我们得以涵盖使用 IntelliJ IDEA 成功构建 Maven 项目的所有必要场景。

我们继续对 Maven 项目使用这种设置:从 Maven 检索必要信息,使用原生 IntelliJ IDEA 机制构建和启动项目,甚至对 Spring Boot 和 Micronaut 等流行工具也是如此。

集成 Gradle

当 Gradle 在市场上推出时,它让用户能够更好地自定义构建流程并为其添加更多功能。

当时,我们决定开始采用与 Maven 类似的方式。 这意味着让 Gradle 处理依赖项和检索必要信息,而 IntelliJ IDEA 将编译代码、运行测试和构建项目。

不过,Gradle 项目模型似乎有些过于灵活。 您可以在构建脚本中使用不同的源集或语言,例如 Groovy、Scala 或 Kotlin。 另外,在构建脚本中还可以编写命令式代码,为构建系统提供所需行为和设置的直接指令。

例如,可以在运行之前或测试运行之前启动数据库。 另外,与包含静态配置的 Maven 相比,Gradle 构建脚本允许在资源处理期间执行任意代码。 使用 IntelliJ IDEA 功能很难重现此类配置。

显然,我们在标准操作方面表现出色,但自定义操作,例如处理资源和其他自定义任务,对我们来说相当难以控制和维护,最重要的是难以在 IntelliJ IDEA 构建系统中复制。

因此,我们决定将测试运行委托给 Gradle:

当您运行测试时,Gradle test 任务将与属于 Gradle 构建周期的其他任务一起执行,如下所示:

此外,IntelliJ IDEA 还提供了额外功能。 举例来说,您需要运行的测试可能分布在不同源集中。 集成测试在一个源集中,而功能测试则在另一个源集中。

IntelliJ IDEA 能够正确确定特定测试文件的测试任务及其位置,确保相关测试有效执行。

此外,IntelliJ IDEA 还提供测试执行级别的信息 – 方法、类或软件包。 例如,Gradle 默认执行源集中的所有测试。

但是,IntelliJ IDEA 会应用筛选模式,并在 Run(运行)工具窗口中显示消息,告知您执行测试的确切位置:

总体而言,Gradle 的测试委托相当成功。

下一步自然是将 Build(构建)和 Run(运行)操作也委托给 Gradle。 最终,委托成为默认选择。

现在,在应用程序中使用 Run(运行)操作时,它会在 Gradle 上下文中使用并动态完成。

类似于现有 Gradle 应用程序插件,我们正在创建运行主类的 JavaExec 类型的任务。 这可以确保应用程序运行配置的最大正确性。

在委托模式下触发 Build(构建)时,IntelliJ IDEA 会根据项目中被修改的模块在 Gradle 中生成需要执行的命令列表。您可以在 BuildOutput 中查看此信息:

IntelliJ IDEA 还可以检测在不同模块中修改的文件并仅构建修改的部分。

目前,有两种委托模式可供选择:Gradle 和 IntelliJ IDEA。

  • Gradle:当流程委托给 Gradle 时,它比我们的原生构建系统稍慢,并且存在少量开销。 有时,在委托模式下,Gradle 守护进程需要重新运行。
    此外,Gradle 会保留其生命周期进程,重新运行 Gradle 模型并检查构建脚本及其文件系统,即使存在由 IntelliJ IDEA 编译的代码。
  • IntelliJ IDEA:如果 Gradle 项目中没有复杂的设置,可以使用 IntelliJ IDEA 加快构建流程。

还要注意,在编译流程中支持注解处理。 不过,当代码由 IntelliJ IDEA 编译时,有一些边缘情况很难处理,例如,注解处理程序在 Gradle 子项目中定义的情况。

这就是我们现在所处的阶段。 我们仍在尝试以委托模式运行 Spring 和 Micronaut 运行配置,并在 IDE 中持续改进 Gradle 委托流程。

我们希望能让您大致了解在 IntelliJ IDEA 中使用委托流程的方法、原因和概览。

一如既往,我们期待您的反馈。 您可以在下方发表评论或使用我们的问题跟踪器请求功能。

祝您开发愉快!

 

本博文英文原作者:

Sue

Elena Kozlova

image description

Discover more