opam 2.0 小技巧
這篇部落格文章回顧了 opam 2.0 的一些改進,並提供了有關可用新工作流程的技巧。
套件開發環境管理
Opam 2.0 在處理本地定義的套件方面得到了大幅改進。假設您有一個專案 ~/projects/foo
,定義了兩個套件 foo-lib
和 foo-bin
,您將會有
~/projects/foo
|-- foo-lib.opam
|-- foo-bin.opam
`-- src/ ...
(另請參閱關於計算出的依賴約束,以處理具有相互約束的多個套件定義)
自動釘選
底層機制是相同的,但這是一個介面改進,取代了基於 opam pin
的大多數 opam 1.2 工作流程。
常用的命令(install
、upgrade
、remove
等)已擴展為支援將目錄指定為參數。因此,在處理專案 foo
時,只需寫入
cd ~/projects/foo
opam install .
foo-lib
和 foo-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
選項。