Jump to content

Nix(包管理器)

From NixOS Wiki
This page is a translated version of the page Nix (package manager) and the translation is 91% 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存储(Nix store)

↱︎
This section is a candidate for splitting off into a separate article. Nix存储在概念上足够独立,有必要单独成文。 For more information, consult the related discussion page.

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找到

备注

  1. 值在计算过程中不会改变。当输入不变时,函数总是得到相同的输出。