opam 新功能:「opam install <目錄>」

opam build功能宣布之後,隨之而來的是許多討論,主要與其介面和誤導性的名稱有關。然而,它提供的基本功能仍然被廣泛要求

  • 一種直接在目前目錄中處理專案的方法,假設它包含一個或多個套件的定義
  • 一種將套件的已安裝檔案複製到指定 destdir 下的方法
  • 一種更容易開始對專案進行黑客攻擊的方法,即使沒有初始化 opam

opam build 的狀態

之前的文章所述,opam build已被捨棄。它將不會出現在下一個 Beta 版本中,以下內容將取代它。

處理本機專案

與本機開關所做的操作一致,我們決定在有意義的地方,重載命令的 <packages> 引數,允許使用目錄名稱代替,並表示「所有在那裡定義的套件」,並帶有一些副作用。

例如,現在允許以下命令,我相信這對很多人來說會非常方便

opam install . --deps-only

這個命令的作用是在目前目錄 (.) 中尋找 opam(或 <pkgname>.opam)檔案,解析它們的安裝,並安裝所有必要的套件。這應該是在手動執行原始碼建置之前的單一步驟。

以下內容稍微複雜一些

opam install .

這也會檢索在 . 定義的套件,並將它們釘選到目前的原始碼(如果存在版本控制,則使用版本控制),然後安裝它們。請注意,後續執行實際上會同步釘選,以便正確追蹤在原始碼樹中移除或重新命名的套件(*即*,移除的取消釘選,新的釘選,其他套件則根據需要升級)。

opam upgradeopam reinstallopam remove 也已更新,以處理目錄作為引數,並將在「釘選到該目標的所有套件」上執行,*即*先前呼叫 opam install <dir> 所釘選的套件。此外,opam remove <dir> 會取消釘選套件,與相反的 install 操作一致。

opam show 已經有一個 --file 選項,但也以相同的方式進行擴展,以保持一致性和方便性。

當然,所有這些都可以在 ./ 的本機開關上良好運作,但是這兩個功能可以完全獨立使用。另請注意,目錄名稱必須與可能的套件名稱明確區分,因此請確保對子目錄 foo 中的本機專案使用 ./foo,而不是僅使用 foo

指定 destdir

這依賴於已安裝的檔案追蹤,但實際上獨立於其他 opam build 功能。現在它只是 opam install 的一個新選項

opam install foo --destdir ~/local/

將正常安裝 foo(如果尚未安裝),並將其所有已安裝的檔案按照相同的階層複製到 ~/local 中。也支援 opam remove --destdir 來移除這些檔案。

初始化

目前已捨棄自動初始化。它只節省了一個命令 (opam init,如果您忘記了,opam 會很樂意為您列印出來),並且有兩個缺點

  • 一些重要細節(例如 opam 的 shell 設定)被跳過
  • 初始化選項大幅減少,因此您經常還是必須返回 opam init。另一種可能性是將 init 選項複製到所有命令,增加了很多雜訊。保持分開有其優點。

當然,另一個命令 opam switch create . 是隱含的。但是,使用本機開關是使用者的選擇,更糟糕的是,這與先前事實上的 opam 預設值相矛盾,因此不自動建立似乎更安全:為了獲得更簡單的行為,必須為 opam build 指定 --no-autoinit 是不方便且容易出錯的。

不過,提供了一項功能來協助初始化:opam switch create <dir> 已改進為可以處理 <dir> 的套件定義,並會像 opam build 一樣使用它們來選擇相容的編譯器。這避免了建立一個開關,然後發現該套件與所選的編譯器版本不相容,然後必須從頭開始顯式選擇不同編譯器的挫敗感。

如果您真的想要自動初始化,並且有更好的介面可以提出,歡迎您提供意見!

已將一些其他新選項新增至 opam install 和相關命令,以改進專案本機工作流程

  • opam install --keep-build-dir 現在補充了 --reuse-build-dir,以便在 opam 中進行增量建置(假設您的建置系統正確支援它)。目前,您應該在每次升級相關套件時同時指定這兩個選項,或者您可以設定 OPAMKEEPBUILDDIROPAMREUSEBUILDDIR 環境變數。
  • opam install --inplace-build 直接在原始碼目錄中執行腳本,而不是在專用的複本中執行。如果多個套件釘選到同一個目錄,這將會停用這些套件的平行建置。
  • opam install --working-dir 使用專案的工作目錄狀態,而不是在版本控制系統中註冊的狀態。請別擔心,如果您有未提交的變更而忘記指定 --working-dir,opam 會警告您。

注意:這篇文章同時發布在opam.ocaml.orgocamlpro.com。請前往後者發表評論!