虽然可以使用编辑器和 sbt 来编写 Scala 代码,但如今大多数程序员都使用集成开发环境(简称 IDE)。Scala 中的两种流行 IDE 是 Metals 和 IntelliJ IDEA,它们都与 sbt 构建集成。
Metals 是一个针对 Scala 的开源语言服务器,它可以充当 VS Code 和其他支持 LSP 的编辑器的后端。Metals 又支持不同的构建服务器,包括通过 构建服务器协议 (BSP) 支持 sbt。
要在 VS Code 上使用 Metals
build.sbt
文件的目录。Cmd-Shift-P
)“Metals:切换构建服务器”,然后选择“sbt”。使用以下设置来选择退出某些子项目。
bspEnabled := false
当您更改代码并保存它们时(在 macOS 上为 Cmd-S
),Metals 将调用 sbt 来执行实际的构建工作。
有关如何在交互式调试会话中导航的更多详细信息,请参阅 VS Code 文档上的 调试 页面。
虽然 Metals 使用 sbt 作为构建服务器,但我们也可以使用瘦客户端登录到同一个 sbt 会话。
sbt --client
这使您可以登录到 Metals 已启动的 sbt 会话。在那里,您可以使用已编译的代码调用 testOnly
和其他任务。
IntelliJ IDEA 是 JetBrains 创建的 IDE,社区版是根据 Apache v2 许可证开源的。IntelliJ 集成了许多构建工具,包括 sbt,以导入项目。这是一种更传统的方法,可能比使用 BSP 方法更可靠。
要将构建导入到 IntelliJ IDEA
build.sbt
文件的目录。IntelliJ Scala 插件使用自己的轻量级编译引擎来检测错误,速度很快,但有时不准确。根据 基于编译器的突出显示,可以将 IntelliJ 配置为使用 Scala 编译器进行错误突出显示。
有关如何在交互式调试会话中导航的更多详细信息,请参阅 IntelliJ 文档上的 调试代码 页面。
将构建导入到 IntelliJ 意味着您实际上是在使用 IntelliJ 作为构建工具和编译器进行编码(另请参阅 基于编译器的突出显示)。虽然许多用户对这种体验感到满意,但根据代码库,一些编译错误可能是错误的,它可能无法与生成源代码的插件良好配合,并且通常您可能希望使用与 sbt 相同的构建语义进行编码。值得庆幸的是,现代 IntelliJ 支持其他构建服务器,包括通过 构建服务器协议 (BSP) 支持 sbt。
在 IntelliJ 中使用 BSP 的好处是您使用 sbt 来执行实际的构建工作,因此如果您是那种在旁边打开 sbt 会话的程序员,这将避免双重编译。
导入到 IntelliJ | IntelliJ 中的 BSP | |
---|---|---|
可靠性 | ✅ 可靠的行为 | ⚠️ 还不成熟。可能会遇到 UX 问题。 |
响应速度 | ✅ | ⚠️ |
正确性 | ⚠️ 使用自己的编译器进行类型检查,但可以配置为使用 scalac | ✅ 使用 Zinc + Scala 编译器进行类型检查 |
生成的源代码 | ❌ 生成的源代码需要重新同步 | ✅ |
构建重用 | ❌ 并排使用 sbt 需要双重构建 | ✅ |
要在 IntelliJ 上使用 sbt 作为构建服务器
Cmd-Shift-P
)并键入“现有”以找到“从现有源导入项目”。build.sbt
文件。在提示时选择BSP。使用以下设置来选择退出某些子项目。
bspEnabled := false
当您更改代码并保存它们时(在 macOS 上为 Cmd-S
),IntelliJ 将调用 sbt 来执行实际的构建工作。
另请参阅 Igal Tabachnik 的 在 IntelliJ 和 Scala 中有效使用 BSP,以了解更多详细信息。
我们也可以使用瘦客户端登录到现有的 sbt 会话。
sbt --client
这使您可以登录到 IntelliJ 已启动的 sbt 会话。在那里,您可以使用已编译的代码调用 testOnly
和其他任务。
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.lua
,g:metals_status
应该显示在状态栏上,可以使用 lualine.nvim 等来完成。
:MetalsInstall
。:MetalsStartServer
。gD
跳转到光标下的符号的定义(确切的键绑定可以自定义)。Ctrl-O
返回旧缓冲区。K
<leader>aa
:cnext
和:cprev
之类的命令来浏览错误和警告。<leader>ae
。<leader>dt
在代码中设置断点K
)构建,然后“调试继续”(<leader>dc
)启动调试器。在提示时选择“1: RunOrTest”。<leader>dK
)检查变量的值<leader>dc
)以结束会话。有关更多详细信息,请参阅nvim-metals。
我们也可以使用瘦客户端登录到现有的 sbt 会话。
:terminal
以启动内置终端。sbt --client
即使它在 Neovim 内,制表符补全等也能在内部正常工作。