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存储(Nix store)
Nix构建得到的包放在只读的Nix存储,正常情况下在/nix/store
。每个包被赋予唯一地址,该地址由加密哈希值后跟包名称和版本指定,比如/nix/store/nawl092prjblbhvv16kxxbk6j9gkgcqm-git-2.14.1
。前缀哈希值来自对构建过程中所有输入的哈希,包括源文件、整个依赖树、编译器标志等。这让Nix能同时安装同一个包的不同版本,甚至同一版本的不同构建,比如不同编译器构建的变体。在添加、移除或更新包时,不会从存储中移除任何包,而是在配置文件(profiles)里添加、移除或修改指向这些包的符号链接。
清理Nix存储
有关清理Nix存储的信息,参考 NixOS手册:章节 - 清理Nix存储。
Nix存储损坏
有关修复损坏的Nix存储的信息,参考 NixOS手册:章节 - Nix存储损坏。
有效的Nix存储名称
- Main article: 有效的Nix存储名称
配置文件(Profiles)
为了搭建一致的用户或系统环境,Nix将Nix存储的条目符号链接到配置文件。这是Nix允许回滚功能的前端:由于存储不可变,先前版本的配置文件被保留,恢复到更早的状态只需要改变符号链接到先前的配置文件。更精确地说,Nix将二进制文件符号链接到Nix存储中表示用户环境的条目。然后这些用户环境被符号链接到/nix/var/nix/profiles
里被标记的配置文件,后者又被符号链接到该用户的~/.nix-profile
。
沙盒化
当启用沙盒构建时,Nix会为每个构建过程设置一个隔离的环境。它用于移除构建环境中额外的隐藏依赖,以提高可复现性。这包括在构建过程中禁止fetch*
函数之外对网络的访问,和Nix存储之外对文件的访问。根据操作系统的不同,对其他资源的访问也会被阻止(例如,进程间通信在Linux上被隔离);详细信息见Nix手册里的nix.conf部分
沙盒化在Linux上默认启用,在macOS上默认禁用。
Nixpkgs的拉取请求(pull requests)中,要求在沙盒化启用条件下测试构建(见拉取请求模板中的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找到
备注
- ↑ 值在计算过程中不会改变。当输入不变时,函数总是得到相同的输出。