opam Switch 簡介

OCaml 的套件管理器 opam 引入了 switch 的概念,這是一個隔離的 OCaml 環境。這些 switch 常常讓 OCaml 的新手感到困惑,因此本文旨在提供對 opam switch 及其使用方式的更佳理解,以便管理相依性和專案特定的組態。

Opam 的設計目的是管理多個稱為「switch」的並行安裝前綴。與 Python 的 virtualenv 類似,opam switch 是一種建立隔離環境的工具。它們彼此獨立,並具有自己的一組已安裝套件、儲存庫和組態選項。Switch 也擁有自己的 OCaml 編譯器、函式庫和二進位檔。這使您可以同時使用多個編譯器版本。

列出 Switch

以下命令將顯示您系統上已設定的 opam switch。完成 OCaml 的安裝(例如在安裝 OCaml中概述)之後,將會建立一個名為 default 的單一 switch。此時,列出 switch 只會顯示該 switch。

$ opam switch list
#   switch   compiler      description
->  default  ocaml.4.13.1  default

建立新的 Switch

要建立新的 opam switch,您可以使用 opam switch 命令,後接所需的 switch 名稱和一個可選的 OCaml 編譯器版本。例如,要建立一個名為「my_project」的 switch 並指定 OCaml 編譯器版本,請使用

opam switch create my_project <compiler-version>

<編譯器版本> 替換為您要使用的 OCaml 編譯器版本。如果您沒有指定編譯器版本,opam 將選擇預設版本。

接下來,啟用您的新 switch。這會將其設定為目前選定的 switch,因此任何與 OCaml 相關的操作都會使用此 switch。您可以執行以下命令來啟用它

opam switch my_project

my_project 替換為您的新 switch 名稱。

確認您已啟用它,請執行

opam switch

如果輸出是您的新 switch 名稱,您就已成功啟用它!現在,您可以將其用於您的 OCaml 專案,並安裝此 switch 特有的 OCaml 套件、函式庫和相依性,而不會影響其他 switch 或系統範圍的 OCaml 環境。

Switch 的類型

全域 Switch

全域 switch 通常用於系統範圍的 OCaml 安裝,並且不與特定專案或目錄相關聯。switch 是在系統層級建立和設定的,通常用於在全域範圍內管理 OCaml 及其生態系統。

建立 opam switch 時,預設情況下它是全域的,除非另有設定。您也可以使用帶有 --global 旗標的 opam switch 命令來明確選擇全域 switch。

Opam 的系統 switch 是一個全域 switch,它與您作業系統上的 OCaml 安裝相關聯。系統 switch 可在整個系統中存取。

本機 Switch

另一方面,本機 opam switch 與特定的專案目錄相關聯。它是在專案的目錄或子目錄中建立的,因此您可以僅在該特定專案的環境中管理 OCaml 及其相依性。

換句話說,本機 switch 為專案特定的 OCaml 環境提供隔離,讓您可以定義和管理特定專案所需的特定編譯器版本和套件。

當您要確保專案使用特定版本的 OCaml 及其套件,而不會干擾系統範圍或其他專案特定的 OCaml 安裝時,它們特別有用。

本機 switch 會根據目前的工作目錄自動選取。當您導覽到具有相關聯本機 switch 的目錄時,opam 會針對該目錄內的任何與 OCaml 相關的操作使用該 switch。

選取 Switch

opam 中大多數與套件相關的命令都在選定的 switch 的環境中運作。您可以使用多種方式選取 switch

全域選取:使用命令 opam switch <switch>。除非被覆寫,否則 Opam 將為所有後續命令使用此 switch。

本機選取:在包含 switch 的目錄中工作時,將會自動選取它。本機 switch 位於 opam 根目錄外部。

環境變數:設定 OPAMSWITCH=<switch> 環境變數以在單一 Shell 工作階段中選擇 switch。使用 eval $(opam env --switch <switch>) 來設定 Shell 環境。

命令列旗標:使用 --switch <switch> 命令列旗標來為單一命令指定 switch。


opam 手冊的「檔案階層」頁面及其專門介紹 switch 的頁面中了解有關 opam switch 的更多詳細資訊和使用方式。

仍然需要協助嗎?

協助改進我們的文件

所有 OCaml 文件都是開放原始碼。看到錯誤或不清楚的地方嗎?提交提取請求。

OCaml

創新。社群。安全性。