1. IDE 集成

IDE 集成 

虽然可以使用编辑器和 sbt 来编写 Scala 代码,但如今大多数程序员都使用集成开发环境(简称 IDE)。Scala 中的两种流行 IDE 是 MetalsIntelliJ IDEA,它们都与 sbt 构建集成。

将 sbt 用作 Metals 构建服务器 

Metals 是一个针对 Scala 的开源语言服务器,它可以充当 VS Code 和其他支持 LSP 的编辑器的后端。Metals 又支持不同的构建服务器,包括通过 构建服务器协议 (BSP) 支持 sbt。

要在 VS Code 上使用 Metals

  1. 从“扩展”选项卡安装 Metals
    Metals
  2. 打开包含 build.sbt 文件的目录。
  3. 从菜单栏中运行“查看”>“命令面板…”(在 macOS 上为 Cmd-Shift-P)“Metals:切换构建服务器”,然后选择“sbt”。
    Metals
  4. 导入过程完成后,打开一个 Scala 文件以查看代码完成是否有效。
    Metals

使用以下设置来选择退出某些子项目。

bspEnabled := false

当您更改代码并保存它们时(在 macOS 上为 Cmd-S),Metals 将调用 sbt 来执行实际的构建工作。

在 VS Code 上进行交互式调试 

  1. Metals 支持通过在代码中设置断点来进行交互式调试。
    Metals
  2. 可以通过右键单击单元测试并选择“调试测试”来启动交互式调试。当测试遇到断点时,您可以检查变量的值。
    Metals

有关如何在交互式调试会话中导航的更多详细信息,请参阅 VS Code 文档上的 调试 页面。

登录到 sbt 会话 

虽然 Metals 使用 sbt 作为构建服务器,但我们也可以使用瘦客户端登录到同一个 sbt 会话。

  • 在“终端”部分,键入 sbt --client
    Metals

这使您可以登录到 Metals 已启动的 sbt 会话。在那里,您可以使用已编译的代码调用 testOnly 和其他任务。

导入到 IntelliJ IDEA 

IntelliJ IDEA 是 JetBrains 创建的 IDE,社区版是根据 Apache v2 许可证开源的。IntelliJ 集成了许多构建工具,包括 sbt,以导入项目。这是一种更传统的方法,可能比使用 BSP 方法更可靠。

要将构建导入到 IntelliJ IDEA

  1. 在“插件”选项卡上安装 Scala 插件。
    IntelliJ
  2. 从“项目”中,打开包含 build.sbt 文件的目录。
    IntelliJ
  3. 导入过程完成后,打开一个 Scala 文件以查看代码完成是否有效。

IntelliJ Scala 插件使用自己的轻量级编译引擎来检测错误,速度很快,但有时不准确。根据 基于编译器的突出显示,可以将 IntelliJ 配置为使用 Scala 编译器进行错误突出显示。

使用 IntelliJ IDEA 进行交互式调试 

  1. IntelliJ 支持通过在代码中设置断点来进行交互式调试。
    IntelliJ
  2. 可以通过右键单击单元测试并选择“调试‘<测试名称>’”来启动交互式调试。您也可以点击编辑器左侧靠近单元测试的绿色“运行”图标。当测试遇到断点时,您可以检查变量的值。
    IntelliJ

有关如何在交互式调试会话中导航的更多详细信息,请参阅 IntelliJ 文档上的 调试代码 页面。

将 sbt 用作 IntelliJ IDEA 构建服务器(高级) 

将构建导入到 IntelliJ 意味着您实际上是在使用 IntelliJ 作为构建工具和编译器进行编码(另请参阅 基于编译器的突出显示)。虽然许多用户对这种体验感到满意,但根据代码库,一些编译错误可能是错误的,它可能无法与生成源代码的插件良好配合,并且通常您可能希望使用与 sbt 相同的构建语义进行编码。值得庆幸的是,现代 IntelliJ 支持其他构建服务器,包括通过 构建服务器协议 (BSP) 支持 sbt。

在 IntelliJ 中使用 BSP 的好处是您使用 sbt 来执行实际的构建工作,因此如果您是那种在旁边打开 sbt 会话的程序员,这将避免双重编译。

导入到 IntelliJ IntelliJ 中的 BSP
可靠性 ✅ 可靠的行为 ⚠️ 还不成熟。可能会遇到 UX 问题。
响应速度 ⚠️
正确性 ⚠️ 使用自己的编译器进行类型检查,但可以配置为使用 scalac ✅ 使用 Zinc + Scala 编译器进行类型检查
生成的源代码 ❌ 生成的源代码需要重新同步
构建重用 ❌ 并排使用 sbt 需要双重构建

要在 IntelliJ 上使用 sbt 作为构建服务器

  1. 在“插件”选项卡上安装 Scala 插件。
  2. 要使用 BSP 方法,请不要使用“项目”选项卡上的“打开”按钮。
    IntelliJ
  3. 从菜单栏中,点击“新建”>“从现有源创建项目”,或查找操作(在 macOS 上为 Cmd-Shift-P)并键入“现有”以找到“从现有源导入项目”。
    IntelliJ
  4. 打开一个 build.sbt 文件。在提示时选择BSP
    IntelliJ
  5. 选择sbt(推荐)作为导入 BSP 工作区的工具。
    IntelliJ
  6. 导入过程完成后,打开一个 Scala 文件以查看代码完成是否有效。
    IntelliJ

使用以下设置来选择退出某些子项目。

bspEnabled := false
  • 打开“首选项”,搜索 BSP 并选中“保存文件时自动构建”,并取消选中“在导入之前将 sbt 项目导出到 Bloop”。
    IntelliJ

当您更改代码并保存它们时(在 macOS 上为 Cmd-S),IntelliJ 将调用 sbt 来执行实际的构建工作。

另请参阅 Igal Tabachnik 的 在 IntelliJ 和 Scala 中有效使用 BSP,以了解更多详细信息。

登录到 sbt 会话 

我们也可以使用瘦客户端登录到现有的 sbt 会话。

  • 在“终端”部分,键入 sbt --client IntelliJ

这使您可以登录到 IntelliJ 已启动的 sbt 会话。在那里,您可以使用已编译的代码调用 testOnly 和其他任务。

将 Neovim 用作 Metals 前端(高级) 

Neovim 是 Vim 的现代分支,开箱即用地支持 LSP,这意味着它可以配置为 Metals 的前端。

Metals 的维护者 Chris Kipp 创建了 nvim-metals 插件,它在 Neovim 上提供了全面的 Metals 支持。要安装 nvim-metals,请根据 Chris 的 lsp.lua$XDG_CONFIG_HOME/nvim/lua/ 下创建 lsp.lua 并根据您的偏好进行调整。例如,注释掉它的插件部分,并使用您选择的插件管理器(如 vim-plug)加载列出的插件。

init.vim 中,可以将该文件加载为

lua << END
require('lsp')
END

根据 lsp.luag:metals_status 应该显示在状态栏上,可以使用 lualine.nvim 等来完成。

  1. 接下来,使用 Neovim 在 sbt 构建中打开一个 Scala 文件。
  2. 在提示时运行 :MetalsInstall
  3. 运行 :MetalsStartServer
  4. 如果状态栏已设置,您应该看到类似“连接到 sbt”或“索引”的内容。
  5. 当您处于插入模式时,代码完成有效,您可以使用 Tab 键浏览候选项。
  • 保存更改时会触发构建,并且编译错误会内联显示。

转到定义 

  1. 您可以使用 gD 跳转到光标下的符号的定义(确切的键绑定可以自定义)。
  2. 使用Ctrl-O返回旧缓冲区。

悬停 

  • 要在光标下显示符号的类型信息(类似于悬停),请在 Normal 模式下使用K

列出诊断信息 

  1. 要列出所有编译错误和警告,请使用<leader>aa
  2. 由于这在标准的快速修复列表中,您可以使用诸如:cnext:cprev之类的命令来浏览错误和警告。
  3. 要仅列出错误,请使用<leader>ae

使用 Neovim 进行交互式调试 

  1. 感谢 nvim-dap,Neovim 支持交互式调试。使用<leader>dt在代码中设置断点
  2. 导航到单元测试,确认它通过悬停(K)构建,然后“调试继续”(<leader>dc)启动调试器。在提示时选择“1: RunOrTest”。
  3. 当测试命中断点时,您可以通过调试悬停(<leader>dK)检查变量的值
  4. 再次“调试继续”(<leader>dc)以结束会话。

有关更多详细信息,请参阅nvim-metals

登录到 sbt 会话 

我们也可以使用瘦客户端登录到现有的 sbt 会话。

  1. 在一个新的 vim 窗口中,键入:terminal以启动内置终端。
  2. 键入sbt --client

即使它在 Neovim 内,制表符补全等也能在内部正常工作。