雖然只使用編輯器和 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」使用以下設定從 BSP 選擇退出某些子專案。
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 | |
---|---|---|
可靠性 | ✅ 可靠的行為 | ⚠️ 較不成熟。可能會遇到使用者體驗問題。 |
回應能力 | ✅ | ⚠️ |
正確性 | ⚠️ 使用自己的編譯器進行類型檢查,但可以組態為使用 scalac | ✅ 使用 Zinc + Scala 編譯器進行類型檢查 |
產生的來源 | ❌ 產生的來源需要重新同步 | ✅ |
建置重用 | ❌ 並排使用 sbt 需要雙重建置 | ✅ |
在 IntelliJ 上使用 sbt 作為建置伺服器
Cmd-Shift-P
)並輸入「現有」以尋找「從現有來源匯入專案」build.sbt
檔案。在出現提示時選取 BSP使用以下設定從 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 內部,Tab 完成等功能在內部也能正常運作。