Nix (package manager)/zh: Difference between revisions
Tags: Mobile edit Mobile web edit |
No edit summary Tags: Mobile edit Mobile web edit |
||
| Line 3: | Line 3: | ||
{{Disambiguation|message=本文介绍的是 Nix 包管理器。不要与 [[Nix ecosystem|Nix 生态系统]]、[[Nix (language)|Nix 语言]] 或 [[Nix (command)|Nix 命令]] 混淆。}} | {{Disambiguation|message=本文介绍的是 Nix 包管理器。不要与 [[Nix ecosystem|Nix 生态系统]]、[[Nix (language)|Nix 语言]] 或 [[Nix (command)|Nix 命令]] 混淆。}} | ||
Nix 是一个软件包管理器和构建系统,它解析由 [[Nix (language)|Nix 表达式语言]] (惰性求值的纯函数式语言) 指定的可复现的构建指令。Nix 表达式是纯函数<ref>值在计算过程中不会改变。当函数的输入不变时,函数总是输出相同的结果。</ref>,它接受依赖作为参数,并生成一个 ''[[Derivations|derivation]]'',用于指定该软件包的可复现的构建环境。Nix 把构建结果存储在由完整依赖树的哈希值指定的唯一地址中,从而创建了一个不可变的包存储 (即 [[#Nix store|nix store]]),使得原子升级、回滚、以及同时安装同一软件包的不同版本成为可能,从根本上消除了 [[Wikipedia:Dependency hell|依赖地狱]]。 | |||
Nix 是一个软件包管理器和构建系统,它解析由 [[Nix | |||
<span id="Usage"></span> | <span id="Usage"></span> | ||
== 用法 == | == 用法 == | ||
=== 安装 === | === 安装 === | ||
在 [[NixOS]] 上,Nix 已经自动安装好了。 | 在 [[NixOS|NixOS]] 上,Nix 已经自动安装好了。 | ||
<div class="mw-translate-fuzzy"> | <div class="mw-translate-fuzzy"> | ||
Revision as of 14:49, 2 June 2026
Nix 是一個軟體包管理器和構建系統,它解析由 Nix 表達式語言 (惰性求值的純函數式語言) 指定的可復現的構建指令。Nix 表達式是純函數[1],它接受依賴作為參數,並生成一個 derivation,用於指定該軟體包的可復現的構建環境。Nix 把構建結果存儲在由完整依賴樹的哈希值指定的唯一地址中,從而創建了一個不可變的包存儲 (即 nix store),使得原子升級、回滾、以及同時安裝同一軟體包的不同版本成為可能,從根本上消除了 依賴地獄。
用法
安裝
在 NixOS 上,Nix 已經自動安裝好了。
如果你想在其他 Linux 發行版或在 macOS 上使用 Nix, 你可以按照 Nix 手冊的安裝章節來安裝 Nix。
Nix 命令
配置
在 NixOS 上, Nix 可以通過 nix 選項進行配置。
獨立的 Nix 通過 nix.conf 進行配置(其通常位於 /etc/nix/)。可用選項的詳細說明可在 Nix 參考手冊中找到.
你也可以使用 Home Manager 配置 Nix,它為單用戶管理聲明式環境。對於系統範圍的配置,可以在 Linux 上使用 System Manager,在 macOS 上使用 nix-darwin。
內部組成
Nix store
由 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 store 中的條目符號連結到 profiles 中。這是 Nix 實現回滾的前端:由於 store 是不可變的且保留先前版本的 profile,將系統還原到先前的狀態只需簡單地將符號連結更改為先前的 profile。更精確地說,Nix 將二進位檔符號連結到 Nix store 中代表用戶環境的條目中。這些用戶環境隨後被符號連結到儲存在 /nix/var/nix/profiles 中被標注的 profile,而它們則進一步符號連結到使用者的 ~/.nix-profile。
沙盒
啟用沙盒構建後,Nix 將為每個構建過程設置一個隔離環境。這用於移除構建環境中的的其它隱藏依賴項,以提高構建結果的可復現性。這包括在構建過程中對 fetch* 函數之外的網絡訪問,以及對 Nix Store 之外的文件訪問的不可行。根據作業系統的不同,對其他資源的訪問也會被阻止(例如,在 Linux 上,進程間通信也是被隔離的)。
沙盒在 Linux 上預設是開啟的,在 macOS 上則否。
在 Nixpkgs 的提取請求 (pull request) 中,請開啟沙盒模式進行測試(請見提取請求模版中的 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 找到。
備註
- ↑ 值在計算過程中不會改變。當函數的輸入不變時,函數總是輸出相同的結果。
