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

使用以下設定從 BSP 選擇退出某些子專案。

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
可靠性 ✅ 可靠的行為 ⚠️ 較不成熟。可能會遇到使用者體驗問題。
回應能力 ⚠️
正確性 ⚠️ 使用自己的編譯器進行類型檢查,但可以組態為使用 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

使用以下設定從 BSP 選擇退出某些子專案。

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 返回舊的緩衝區。

懸停 

  • 若要顯示游標下符號的型別資訊(如懸停),請在一般模式下使用 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 內部,Tab 完成等功能在內部也能正常運作。