Nix 包管理器简介——一个纯功能的包管理器

在本文中,我们将讨论 Nix 包管理器。 如果您在任何 Linux 发行版上阅读本文,您可能知道包管理器是什么。 但对于初学者来说,is 包管理器是用于在设备上安装、删除、升级包的软件。 然而,像 apt 和 Pacman 这样的传统包管理器存在多个缺陷,这使得它们在需要高度稳定系统的环境(如服务器)中使用起来不可靠。

然而,Nix 旨在成为一个可靠且可重现的包管理系统,解决传统包管理器带来的常见问题。 但是要了解解决方案,我们必须先了解问题。

传统包管理器的缺点

更改无法撤消:传统的包管理器如 apt 或 Pacman 将所有包全局安装在 /usr/local/bin 中。 如果您更新或重新配置任何包,它只会更新 /usr/local/bin 中的相应文件,从而永久更改该包的状态,而无法恢复到旧版本。

更新不是原子的 (立即的):在任何更新期间,对包的更改将在整个更新期间应用。 C。 这意味着,如果升级到新配置的过程中断——比如中途断电——系统仍将处于一致状态:i,它可能会破坏整个系统,一半更新的驱动程序和一半安装的依赖项。

依赖地狱:这个问题甚至有一个专门针对它的维基百科页面。 假设您必须安装依赖于包 B 和包 C 的包 A 。 B 和 C 又依赖于 D 的两个不同版本。这是一个问题,因为传统的包管理器不能同时使用同一个包的两个版本。 所以在这种情况下,我们可以安装 B 或 D,但不能同时安装,因此我们不能安装 A。这种特殊类型的问题称为菱形依赖冲突。

钻石依赖冲突

还有很多其他的依赖问题,比如循环依赖冲突和线性依赖冲突,都是因为传统的包管理器不能并排安装同一个包的两个版本。

Nix 如何解决这些问题

正如标题中提到的,Nix 是一个纯功能的包管理器。 简单来说,这意味着 Nix 构建的所有包都有一个唯一的哈希附加到它们上面,这是由包的依赖项派生的。

把它想象成一台机器,它接受与包相关的所有输入,即它的依赖项、所有依赖项的版本、C/CXX 标志、源代码、配置文件、环境变量、外部补丁等,然后输出一个表达式(Nix表达式)然后生成一个具有唯一哈希值的包,该哈希值无法更改并将其存储在 /nix/store/some-unique-package-name 中。 例如,我的路径 bash 壳是

/nix/store/hrpvwkjz04s9i4nmli843hyw9z4pwhww-bash-4.4-p23  

通过更改依赖项版本或使用不同的依赖项来重新编译包将导致具有不同散列的完全不同的包。

多个版本: 由于散列方案,包的不同版本最终会在 Nix 存储中的不同路径中,因此它们不会相互干扰。 重新审视依赖地狱的问题,由于现在包 D 的两个版本是完全不同的包,您可以使用一个版本构建包 B,使用另一个版本构建包 C,没有任何冲突。

原子更改和回滚:由于更新的包与现有的包完全不同,旧包不会被删除,但新包只会在旧包上进行符号链接。 由于没有对当前使用的软件包进行任何更改,因此如果更新过程在两者之间中断,它不会破坏系统。 实际的更改,即在旧版本上链接新版本的包是在瞬间(原子)完成的。

由于旧版本的软件包仍然存在,这意味着您可以随时将机器回滚到旧软件包。

如果您认为整个多版本 shebang 会占用太多空间,您可以随时运行垃圾收集命令,该命令将删除您未使用的包。

再现性: 通过Nix,很容易复制开发环境。 您所要做的就是检查任何包的配置文件,其中提到了包的所有内容,将其复制到系统,并使用相同的依赖版本和环境变量重建包。 并且这两个环境是否一致将非常清楚,因为复制环境中的所有包都应该具有与原始环境相同的哈希值。

如何安装 Nix

如果您对 Nix 感到兴奋并想试用 Nix,但又不想离开您花费数月建立的舒适发行版,我有好消息。 只需一个命令,您就可以在任何 Linux 发行版上安装 Nix 包管理器。 只需在终端中执行以下命令即可。

$ curl -L https://nixos.org/nix/install | sh 

但是,如果您想要完整的体验,您可以随时下载并安装 NixOS,它使用 Nix 不仅用于包管理,还用于管理系统配置(例如,在 /etc)。 这意味着很容易将系统的整个配置回滚到较早的状态。

如何使用 Nix 包管理器?

让我们开始为您的 Linux 发行版使用 Nix 包管理器。

1. 简介

Nix 上的不同用户可以安装不同的软件包集并具有不同的配置。 在配置文件中所做的任何更改都不会影响任何其他配置文件,因为它们是沙盒的。

2. 渠道

通道是由 Nix 正式验证的包(及其定义)的 git 存储库列表。 这类似于 Ubuntu/Debian/Arch 中存储库的概念。 有多种渠道基于不同的验证级别。 您可以在此处找到频道列表。

列出当前频道:

$ nix-channel --list 

订阅新频道:

nix-channel --add https://some.channel/url my-alias 

删除频道:

nix-channel --remove channel-alias 

更新频道:

nix-channel --update channel-alias 

更新所有频道:

nix-channel --update 

3. 搜索包

要在当前频道列表中搜索包:

nix search <pkg-name> 

它将列出一堆包含关键字的应用程序 <nixpkgs.pkg-name> 格式。

但是,您也可以访问 Nix 在线商店并搜索包含有关如何安装它的说明的软件包。

在线 Nix 包

4. 安装包

要在当前配置文件中安装任何包,请使用

nix-env -iA <nixpkgs.pkg-name> 

“-A”标志使我们能够选择一个特定的渠道来下载包。 如果要从默认频道安装,请使用

nix-env -i <pkg-name> 

5. 卸载包

要在当前配置文件中安装任何包,请使用

nix-env -e <pkg-name> 

6.升级包

要升级任何特定的软件包,请使用

nix-env -u subversion 

要升级配置文件中的所有包,请使用

nix-env -u 

7. 回滚

你可以回滚你最后 nix-env 命令使用

nix-env --rollback 

每次执行 nix-env 操作,创建用户环境的新用户生成。 例如,当我们安装 tdesktop 时,新的一代就被创建了。 您可以使用列出所有世代

nix-env --list-generations 

并使用切换到特定的一代

nix-env --switch-generation <gen-number> 
尼克斯世代尼克斯世代

8. 垃圾清除

您可以使用删除旧世代

nix-env --delete-generations old 

删除特定的世代,使用

nix-env --delete-generations 1 2 

结论

恭喜。 现在您了解了 Nix 和 Nix 中的基本包管理,您将不必担心可怕的依赖关系和破坏您系统的新更新。 要了解有关 Nix 的更多信息,您可以使用官方 Nix Wiki。 玩得开心!