Jump to content

Nix (軟件包管理器)

From Official NixOS Wiki
This page is a translated version of the page Nix (package manager) and the translation is 100% complete.
Introduction to Nix

Tools and applications

⤧︎
Disambiguation: 本文介紹的是 Nix 包管理器。不要與 Nix 生態系統Nix 語言Nix 命令 混淆。

Nix 是一個軟件包管理器和構建系統,它解析由 Nix 表達式語言 (惰性求值的純函數式語言) 指定的可復現的構建指令。Nix 表達式是純函數[1],它接受依賴作為參數,並生成一個 derivation,用於指定該軟件包的可復現的構建環境。Nix 把構建結果存儲在由完整依賴樹的哈希值指定的唯一地址中,從而創建了一個不可變的包存儲 (即 nix store),使得原子升級、回滾、以及同時安裝同一軟件包的不同版本成為可能,從根本上消除了 依賴地獄

用法

安裝

NixOS 上,Nix 已經自動安裝好了。

如果您想在其他 Linux 發行版或在 macOS 上使用, 您可以按照 Nix 手冊的安裝章節 來安裝 Nix。

Nix 命令

Nix 命令Nix 參考手冊 中有詳細記錄:主要命令、工具命令和實驗性命令。在 2.0 版本(於 2018 年 2 月發布)之前,命令有所不同。

配置

在 NixOS 上, Nix 可以通過 nix 選項 進行配置。

獨立安裝的 Nix 通過 nix.conf 進行配置(其通常位於 /etc/nix/)。可用選項的詳細說明可在 Nix 參考手冊 中找到.

你也可以使用 Home Manager 配置 Nix,它為單用戶提供管理聲明式環境的能力。對於系統範圍的配置,可以在 Linux 上使用 System Manager,在 macOS 上使用 nix-darwin

內部機制

Nix store

↱︎
This section is a candidate for splitting off into a separate article. Nix store 在概念上有足夠的獨立性,值得單獨成文。 For more information, consult the related discussion page.

由 Nix 構建的軟件包會被放置在只讀的 Nix store 中,通常位於 /nix/store。每個軟件包都會被賦予一個唯一的地址,該地址由加密哈希值、軟件包名稱和版本組成,例如 /nix/store/nawl092prjblbhvv16kxxbk6j9gkgcqm-git-2.14.1。這些前綴對構建過程中的所有輸入進行哈希,包括源文件、完整的依賴樹、編譯器參數等。這使得 Nix 能夠同時安裝同一軟件包的不同版本,甚至是同一版本的不同構建(例如使用不同編譯器構建的變體)。在添加、移除或更新軟件包時,存儲中的內容不會被刪除;相反,profiles 中指向這些軟件包的符號連結會被添加、移除或更改。

清理 Nix store

有關清理 Nix store 的信息,請參閱 NixOS 手冊:章節 - 清理 Nix 存儲

Nix store 損壞

有關修復 Nix store 損壞的信息,請參閱 NixOS 手冊:章節 - Nix store 損壞

有效的 Nix store 名稱

Main article: Valid Nix store path names

Profiles

為了構建一個連續的用戶或系統環境,Nix 會將 Nix 存儲庫中的條目軟連結到 配置(profiles) 中。這些配置文件是 Nix 實現回滾的前端:由於存儲庫是不可變的,並且會保留配置文件的先前版本,因此恢復到之前的狀態只需更改指向先前配置文件的符號連結即可。更準確地說,Nix 會將二進制文件軟連結到 Nix 存儲庫中代表用戶環境的條目。這些用戶環境隨後會被軟連結到存儲在 /nix/var/nix/profiles 目錄下的帶標籤的配置文件中,而這些配置文件又會被軟連結到用戶的 ~/.nix-profile 文件。

沙盒

啟用沙盒構建後,Nix 將為每個構建過程設置一個隔離環境。這用於移除構建環境中的的其它隱藏依賴項,以提高構建結果的可復現性。這包括在構建過程中對 fetch* 函數之外的網絡訪問,以及對 Nix Store 之外的文件訪問的不可行。根據作業系統的不同,對其他資源的訪問也會被阻止(例如,在 Linux 上,進程間通信也是被隔離的)。

Linux 系統默認啟用沙盒,而 macOS 系統則默認禁用沙盒。 在 Nixpkgs 的拉取請求中,提交者被要求啟用沙盒進行構建測試(請參閱拉取請求模板中的 Tested using sandboxing),因為 官方 Hydra 構建 中也使用了沙盒。

要為 Nix 配置沙盒,請在 /etc/nix/nix.conf 中設置 sandbox = true;要為 NixOS 配置沙盒,請在 configuration.nix 中設置 nix.useSandbox = true;。自 NixOS 17.09 起,nix.useSandbox 選項默認為 true

可選的解釋器

目前正在進行一項計劃,從零開始使用 Rust 重新實現 Nix。

Nix 2.18 還有一個名為 Lix 的社區分支,專注於正確性、易用性和可擴展性。雖然它也把 Nix 的一些組件移植到了 Rust,但它不像 Tvix 那樣是從零開始重寫的。

早期嘗試可以在 riir-nix 中找到。

備註

  1. 值在計算過程中不會改變。當函數的輸入不變時,函數總是輸出相同的結果。