Nix (package manager)/zh: Difference between revisions

Mayer (talk | contribs)
Created page with "When sandbox builds are enabled, Nix will setup an isolated environment for each build process. 当沙盒构建被启用时, Nix会为每一个构建进程设置一个孤立的环境.It is used to remove further hidden dependencies set by the build environment to improve reproducibility. This includes access to the network during the build outside of <code>fetch*</code> functions and files outside the Nix store. Depending on the operating system access to other resource..."
Tags: Mobile edit Mobile web edit
Ardenet (talk | contribs)
No edit summary
Tags: Mobile edit Mobile web edit
 
(55 intermediate revisions by 4 users not shown)
Line 1: Line 1:
Nix是一个包管理器和构建系统, 解析[[Nix Expression Language|Nix表达式语言]] (惰性求值的纯函数式语言) 指定的可现的构建指令. Nix表达式是纯函数<ref>计算过程中,值改变. 当函数的输入不变时,函数总是输出相同的结果. </ref>, 接受依赖作为参数,并为包产生一个指定了可再现的构建环境的 ''[[Derivations|derivation]]'' . Nix把构建结果存储在由完整依赖树的哈希值指定的唯一地址中, 创建了一个不可变的包存储 (即[[#Nix store|nix存储]]), 这使得原子升级, 回滚, 以及不同版本的包的同时安装成为可能, 从根本上消除了[https://en.wikipedia.org/wiki/Dependency_hell 依赖地狱].
<languages/>
{{Navbox 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|依赖地狱]]。


<span id="Usage"></span>
<span id="Usage"></span>
== 用法 ==
== 用法 ==


<span id="Installation"></span>
=== 安装 ===
=== 安装 ===
NixOS: 当你在安装NixOS时, Nix就已经安装好了.


如果想在另一个Linux发行版或一台Mac电脑上使用Nix, 可以进行独立安装: [https://nixos.org/manual/nix/stable/installation/installation Nix手册的安装部分]讲述了从二进制文件或源代码的独立的Nix安装过程
在 [[NixOS|NixOS]] 上,Nix 已经自动安装好了。
 
如果想在其他 Linux 发行版或在 macOS 上使, 可以按照 [https://nix.dev/manual/nix/stable/installation/ Nix 手册的安装章节] 安装 Nix。


<span id="Nix_commands"></span>
<span id="Nix_commands"></span>
=== Nix命令 ===
=== Nix 命令 ===


[[Nix command|Nix命令]]被记录在[https://nixos.org/manual/nix/stable/command-ref/command-ref Nix参考手册]: 主要命令, 工具命令和实验性命令. 在2.0版本(于2018年2月发布)之前, 命令有所不同.
[[Nix (command line utilities)|Nix 命令]] 在 [https://nix.dev/manual/nix/stable/command-ref/ Nix 参考手册] 中有详细记录:主要命令工具命令和实验性命令。在 2.0 版本(于 2018 年 2 月发布之前命令有所不同


<span id="Configuration"></span>
=== 配置 ===
=== 配置 ===
在NixOS上, Nix通过[https://search.nixos.org/options?query=nix. <code>nix</code> 选项]进行配置.


独立的Nix配置需要通过<code>nix.conf</code> (通常位于 <code>/etc/nix/</code>), 它定义了一系列和求值,构建,垃圾回收,沙盒,以及用户权限的设置. 这些可用选项的细可在[https://nixos.org/manual/nix/stable/command-ref/conf-file Nix参考手册]中找到.  
在 NixOS 上, Nix 可以通过 [https://search.nixos.org/options?query=nix <code>nix</code> 选项] 进行配置。
 
独立安装Nix 通过 <code>nix.conf</code> 进行配置(其通常位于 <code>/etc/nix/</code>)。可用选项的说明可在 [https://nix.dev/manual/nix/stable/command-ref/conf-file Nix 参考手册] 中找到.  


单用户可使用 [[Home Manager]] 进一步配置声明式环境的管理. 于Linux上的系统配置, 你可以使用 System Manager. 对于macOS的系统级配置, nix-darwin 是更佳的解决方案. 
你也使用 [[Home Manager|Home Manager]] 配置 Nix,它为单用户提供管理声明式环境的能力。系统范围的配置可以在 Linux 上使用 [https://github.com/numtide/system-manager System Manager],在 macOS 使用 [https://github.com/nix-darwin/nix-darwin nix-darwin]。


<span id="Internals"></span>
<span id="Internals"></span>
== 内部组成 ==
== 内部机制 ==
 
=== Nix store ===
 
{{Split|reason=Nix store 在概念上有足够的独立性,值得单独成文。}}
 
由 Nix 构建的软件包会被放置在只读的 ''Nix store'' 中,通常位于 <code>/nix/store</code>。每个软件包都会被赋予一个唯一的地址,该地址由加密哈希值、软件包名称和版本组成,例如 <code>/nix/store/nawl092prjblbhvv16kxxbk6j9gkgcqm-git-2.14.1</code>。这些前缀对构建过程中的所有输入进行哈希,包括源文件、完整的依赖树、编译器参数等。这使得 Nix 能够同时安装同一软件包的不同版本,甚至是同一版本的不同构建(例如使用不同编译器构建的变体)。在添加、移除或更新软件包时,存储中的内容不会被删除;相反,''profiles'' 中指向这些软件包的符号链接会被添加、移除或更改。
 
<span id="Cleaning_the_Nix_store"></span>
==== 清理 Nix store ====
 
有关清理 Nix store 的信息,请参阅 {{NixOS Manual|name=NixOS 手册:章节 - 清理 Nix 存储|anchor=#sec-nix-gc}}。
 
<span id="Nix_store_corruption"></span>
==== Nix store 损坏 ====
 
有关修复 Nix store 损坏的信息,请参阅 {{NixOS Manual|name=NixOS 手册:章节 - Nix store 损坏|anchor=#sec-nix-store-corruption}}。


<span id="Nix_store"></span>
<span id="Valid_Nix_store_names"></span>
=== Nix store(Nix存储库) ===
==== 有效的 Nix store 名称 ====


由Nix构建的包被放在只读的''Nix存储库'', 通常位于<code>/nix/store</code>. 每个包会被赋予一个由加密hash值指定的独一无二的地址, 该地址位于包的名称和版本之后, 例如<code>/nix/store/nawl092prjblbhvv16kxxbk6j9gkgcqm-git-2.14.1</code>. 这些前缀的哈希处理使用到了对构建过程的所有输入, 包括源文件, 完整依赖关系树, 编译器标志, 等等. 这让Nix可以同时安装同一个包的不同版本, 甚至同一版本的不同构建, 比如由不同的编译器构建的变体. 当添加, 移除, 或者更新一个包时, 什么都没有从Nix存储库中被移除; 作为替代,指向这些包的符号链接在''profile''中被添加, 移除或者修改.
{{main|Valid Nix store path names}}


<span id="Profiles"></span>
=== Profiles ===
=== Profiles(系统画像) ===


为了建一个连的用户或系统环境, Nix将Nix存储库中的条目符号链接到''profile''. 这些是Nix允许回滚的"前端": 因为存储库是不可变的, 而的profile版本被保留了下来, 回更早的状态只需要简单地让符号链接指向一个先前的profile. 确地说, Nix将二进制文件符号链接到Nix存储库中描述用户环境的条目中. 这些用户环境随符号链接到<code>/nix/var/nix/profiles</code>标签的profile, 而这些profile又被符号链接到用户的<code>~/.nix-profile</code>.
为了建一个连的用户或系统环境,Nix 会将 Nix 存储库中的条目链接到 ''配置(profiles)'' 中。这些配置文件是 Nix 实现回滚的前端:由于存储库是不可变的,并会保留配置文件的先前版本,因此恢复之前的状态只需更改指向先前配置文件的符号链接即可。确地说,Nix 会将二进制文件链接到 Nix 存储库中代表用户环境的条目这些用户环境随后会链接到存储在 <code>/nix/var/nix/profiles</code> 目录下的带标签的配置文件中,而这些配置文件链接到用户的 <code>~/.nix-profile</code> 文件。


<span id="Sandboxing"></span>
<span id="Sandboxing"></span>
=== 沙盒===
=== 沙盒 ===


When sandbox builds are enabled, Nix will setup an isolated environment for each build process. 沙盒构建被启用时, Nix会为每个构建程设置一个孤立的环境.It is used to remove further hidden dependencies set by the build environment to improve reproducibility. This includes access to the network during the build outside of <code>fetch*</code> functions and files outside the Nix store.  Depending on the operating system access to other resources are blocked as well (ex. inter process communication is isolated on Linux); see [https://nixos.org/nix/manual/#sec-conf-file nix.conf section] in the Nix manual for details.
启用沙盒构建后,Nix 将为每个构建程设置一个隔离环境。这用于移除构建环境中的的其它隐藏依赖项,以提高构建结果的可复现性。这包括在构建过程中对 <code>fetch*</code> 函数之外的网络访问,以及对 Nix Store 之外的文件访问的不可行。根据操作系统的不同,对其他资源的访问也会被阻止(例如,在 Linux 上,进程间通信也是被隔离的)。


<div lang="en" dir="ltr" class="mw-content-ltr">
Linux 系统默认启用沙盒,而 macOS 系统则默认禁用沙盒。
Sandboxing is enabled by default on Linux, and disabled by default on macOS.
[https://github.com/NixOS/nixpkgs/ Nixpkgs] 的拉取请求中,提交者被要求启用沙盒进行构建测试(请参阅拉取请求模板中的 <code>Tested using sandboxing</code>),因为 [https://nixos.org/hydra/ 官方 Hydra 构建] 中也使用了沙盒。
In pull requests for [https://github.com/NixOS/nixpkgs/ Nixpkgs] people are asked to test builds with sandboxing enabled (see <code>Tested using sandboxing</code> in the pull request template) because in [https://nixos.org/hydra/ official Hydra builds] sandboxing is also used.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
要为 Nix 配置沙盒,请在 <code>/etc/nix/nix.conf</code> 中设置 <code>sandbox = true</code>;要为 NixOS 配置沙盒,请在 <code>configuration.nix</code> 中设置 <code>nix.useSandbox = true;</code>。自 NixOS 17.09 起,<code>nix.useSandbox</code> 选项默认为 <code>true</code>
To configure Nix for sandboxing, set <code>sandbox = true</code> in <code>/etc/nix/nix.conf</code>; to configure NixOS for sandboxing set <code>nix.useSandbox = true;</code> in <code>configuration.nix</code>. The <code>nix.useSandbox</code> option is <code>true</code> by default since NixOS 17.09.
</div>


<span id="Alternative_Interpreters"></span>
<span id="Alternative_Interpreters"></span>
=== 可选的解释器 ===
=== 可选的解释器 ===


<div lang="en" dir="ltr" class="mw-content-ltr">
目前正在进行一项计划,从零开始使用 Rust 重新实现 Nix
There is an ongoing effort to reimplement Nix, from the ground up, in Rust.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
* [https://code.tvl.fyi/tree/tvix tvix]
* [https://cs.tvl.fyi/depot/-/tree/tvix tvix]
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Nix 2.18 还有一个名为 Lix 的社区分支,专注于正确性、易用性和可扩展性。虽然它也把 Nix 的一些组件移植到了 Rust,但它不像 Tvix 那样是从零开始重写的。
There is also a community-led fork of Nix 2.18 named Lix, focused on correctness, usability, and growth. While it has also ported some components of Nix to Rust, it is not a ground-up rewrite like Tvix.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
* [https://lix.systems/ lix]
* [https://lix.systems/ lix]
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
早期尝试可以在 [https://riir-nix.github.io/ riir-nix] 中找到。
Earlier attempts can be found on [https://riir-nix.github.io/ riir-nix]
 
</div>
<span id="Notes"></span>
== 备注 ==


<div lang="en" dir="ltr" class="mw-content-ltr">
==Notes==
<references />
<references />
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
[[Category:Pedias]]
[[Category:Pedias]]
[[Category:Nix]]
[[Category:Nix]]
[[Category:Incomplete]]
[[Category:Incomplete]]
[[Category:Software]]
[[Category:Software]]
</div>