opam 新功能:本機切換

在 opam 2.0 中,我們想要改進的其中一個方面是切換 (switches) 的處理。在 opam 1.2 中,它們只是透過名稱(預設為 OCaml 版本)存取,並且總是儲存在 ~/.opam/<name> 中。這樣做沒問題,但當存在許多切換時可能會變得有些繁瑣,因為沒有辦法對它們進行排序或將它們與給定的專案關聯起來。

關於切換的提醒

對於那些不熟悉的人來說,在 opam 中,切換是具有自己編譯器和安裝套件的獨立前綴。opam switch 命令允許建立和移除切換,以及選擇目前活動的切換,opam install 等操作將在其中執行。

它們的用途包括輕鬆地在 OCaml 或函式庫的版本之間切換、將不相容的套件分開但同時安裝、在不損壞「主要」環境的情況下執行測試,並且通常用於分離在不同專案上工作的環境。

您也可以使用以下命令為單個命令選擇特定的切換:

opam install foo --switch other

甚至可以使用以下命令為單個 shell 工作階段選擇特定的切換:

eval $(opam env --switch other)

opam 2.0 在此基礎上新增的功能是,可以建立所謂的本機切換,這些切換儲存在您選擇的目錄下。這讓使用者重新掌握了如何組織切換的控制權,並且清除目錄是擺脫切換的安全方法。

在專案中使用

這是主要的預期用途:使用者可以在專案的原始碼中定義一個切換,專門用於該專案。為了幫助實現這一點,一個不錯的副作用是,如果在目前目錄或父目錄中偵測到「本機切換」,opam 將會自動選擇它。請記住,在執行 make 之前,先執行 eval $(opam env) 以使環境保持最新狀態。

介面

該介面只是簡單地重載了 switch-name 參數(無論它們出現在何處),允許使用目錄名稱代替。例如:

cd ~/src/project
opam switch create ./

將在 ~/src/project 目錄中建立一個本機切換。然後,從該目錄執行 opam list 或從任何地方執行 opam list --switch=~/src/project 是等效的。

請注意,如果需要,您可以使用 --switch 參數、定義變數 OPAMSWITCH 或使用 eval $(opam env --switch <name>) 來繞過自動本機切換選擇。

實作

實際上,切換內容會放置在 _opam/ 子目錄中。因此,如果您建立切換 ~/src/project,您可以在 ~/src/project/_opam 瀏覽其內容。這是切換的直接前綴,因此例如,二進位檔案可以直接在 _opam/bin/ 中找到:比搜尋 opam 根目錄更容易!opam 元資料放置在該目錄下的 .opam-switch/ 子目錄中。

本機切換仍然共用 opam 根目錄,尤其取決於其中定義和快取的儲存庫。但是,現在可以為不同的切換選擇不同的儲存庫,但這是另一個文章的主題。

最後,請注意,刪除 _opam 目錄由 opam 透明地處理,並且如果您想在專案之間共用本機切換,則允許符號連結 _opam 目錄。

目前狀態

此功能已在我們的開發版本中存在一段時間,您已經可以在目前的 beta 版本中使用它。

限制和未來擴充

目前,無法移動本機切換目錄,主要是由於與重新定位 OCaml 編譯器相關的問題。

建立新的切換仍然意味著重新編譯所有套件,甚至包括編譯器本身(除非您依賴於系統安裝)。預計的解決方案是新增一個建置快取,避免需要使用相同的依賴項重新編譯相同的套件。這實際上應該可以使用目前的 opam 2.0 程式碼來實現,方法是利用可用的新掛鉤。但是,OCaml 的重新定位也是一個問題。

諸如 ocp-indentmerlin 之類的編輯工具在切換數量增加時也會變得煩人,因為如果沒有安裝在目前切換中,則不會自動找到它們。但是 user-setup 外掛程式(執行 opam user-setup install)已經很好地處理了這一點,如果目前切換中找不到 ocp-indenttuareg,它將從它們的初始切換中存取它們。但是,您仍然需要在您需要它們的切換中安裝與編譯器版本緊密綁定的工具,例如 merlinocp-index

注意:本文在 opam.ocaml.orgocamlpro.com 上交叉發佈。請前往後者進行評論!