opam 2.0 小技巧

這篇部落格文章回顧了 opam 2.0 的一些改進,並提供了有關可用新工作流程的技巧。

套件開發環境管理

Opam 2.0 在處理本地定義的套件方面得到了大幅改進。假設您有一個專案 ~/projects/foo,定義了兩個套件 foo-libfoo-bin,您將會有

~/projects/foo
|-- foo-lib.opam
|-- foo-bin.opam
`-- src/ ...

(另請參閱關於計算出的依賴約束,以處理具有相互約束的多個套件定義)

自動釘選

底層機制是相同的,但這是一個介面改進,取代了基於 opam pin 的大多數 opam 1.2 工作流程。

常用的命令(installupgraderemove 等)已擴展為支援將目錄指定為參數。因此,在處理專案 foo 時,只需寫入

cd ~/projects/foo
opam install .

foo-libfoo-bin 都會自動釘選到目前目錄(如果您的專案已版本控制,則使用 git),並安裝。您可能更喜歡使用

opam install . --deps-only

以便在開始修改之前準備好套件依賴項。請參閱下文,以了解如何更精確地重現建置環境的詳細資訊。請注意,opam depext . 目前無法運作,這將在下一個版本中修復,屆時將整合外部依賴項處理(opam 仍然會在失敗時列出您的作業系統的正確安裝套件)。

如果您的專案已版本控制並且您進行了變更,請記得提交或新增 --working-dir,以便將您未提交的變更納入考量。

本機切換

Opam 2.0 引入了一個稱為「本機切換」的新功能。本節說明其內容、原因、時間和使用方式。

Opam 切換允許維護多個獨立的開發環境,每個環境都安裝了自己的套件集。當您需要不同的 OCaml 版本,或處理具有不同依賴項集的專案時,這特別有用。

但是,管理或記住要使用哪個專案切換有時可能會很麻煩。這就是「本機切換」派上用場的地方。

本機切換的處理方式

本機切換只是儲存在 _opam/ 目錄中,當您的目前目錄在其父目錄下方時,opam 會自動選取它。

注意:強烈建議您在使用本機切換時啟用新的shell hook。只需執行 opam init --enable-shell-hook:這將確保您的 PATH 始終設定為正確的切換。

否則,您每次 cd 到包含本機切換的目錄時,都需要不斷記住執行 eval $(opam env)。另請參閱 如何在提示中顯示目前切換

例如,如果您有 ~/projects/foo/_opam,則無論在專案 foo 中何處,都會選取該切換,讓您可以根據專案的需求客製化其安裝內容。

如果您移除切換目錄或整個專案,opam 會以透明方式忘記它。但是,請小心不要隨意移動它,因為某些套件仍然包含硬式編碼的路徑,並且無法很好地處理重新定位(我們正在努力解決這個問題)。

建立本機切換

這通常可以從

cd ~/projects/foo
opam switch create . --deps-only

開始。本機切換的處理方式只是其路徑,而不是原始名稱。此外,上述操作將偵測 ~/projects/foo 中存在的套件定義,選取相容的 OCaml 版本(如果您沒有明確提及任何版本),並自動安裝所有本機套件依賴項。

如果沒有 --deps-only,套件本身也會安裝在本機切換中。

使用現有的切換

如果您只想自動選取已存在的切換,而無需為每個專案重新編譯一個切換,則可以使用 opam switch link

cd ~/projects/bar
opam switch link 4.07.1

將確保當您在專案 bar 中時選取切換 4.07.1。您甚至可以連結到此處的 ../foo,以在兩個專案之間共用 foo 的本機切換。

重現建置環境

釘選

如果您的套件依賴某些依賴項的開發版本(例如,您必須將修正程式推送至上游),請新增至您的 opam 檔案

depends: [ "some-package" ] # Remember that pin-depends are depends too
pin-depends: [
  [ "some-package.version" "git+https://gitfoo.com/blob.git#mybranch" ]
]

當您的套件發佈在儲存庫中時,這將不起作用,但是當它釘選到其開發版本時,opam 會先確保將 some-package 釘選到給定的 URL。

鎖定檔案

依賴項約束有時太寬泛,您不想在開發時瀏覽所有依賴項的版本。因此,您可能想要重現一組已知可運作的依賴項。如果您使用

opam lock .

opam 將檢查目前切換中安裝的依賴項版本,並將其明確寫入 *.opam.locked 檔案中。opam lock 目前是外掛程式,但會在需要時自動安裝。

然後,假設您已將這些檔案簽入版本控制,任何使用者都可以執行

opam install . --deps-only --locked

以指示 opam 重現相同的建置環境(--locked 選項也適用於 opam switch create,以簡化操作)。

產生的鎖定檔案也會包含新增的約束,以重現選用依賴項的存在/不存在,並使用 pin-depends 重現適當的依賴項釘選。如果您不想強制執行所有遞迴依賴項的版本,而只想強制執行直接依賴項的版本,請新增 --direct-only 選項。