如何使用 Nix 在 macOS 上安装软件

Nix 是一个包管理器,它提供跨平台的基于容器的开发环境。与 Docker 和 Kubernetes 等容器系统类似,Nix 允许您跨机器和网络安装配置的开发环境,同时减少配置和麻烦。

传统上,在 Mac 上,用户使用 MacPorts 或 Homebrew 来安装第三方软件包。这两种系统都有优点和缺点。

Homebrew 因其易用性和安装性而在 Mac 社区中很受欢迎:只需几个命令即可从 macOS 中的终端应用程序安装软件包,并且更新是自动的,同样简单。

但是,Homebrew 和 MacPorts 都缺乏跨机器的可移植性。您可以编写终端 (shell) 脚本来跨系统安装 Homebrew 或 MacPorts 软件包,但脚本维护可能会变得复杂,并且通常很难编写知道所有可能的计算机配置的脚本。

Nix 通过容器化开发环境并使其在系统之间更具可移植性来解决这个问题。

使用 Nix 付出的代价是配置稍微复杂一些,学习曲线也更陡峭。

Nix 生态系统

NixOS 基金会的 NixOS 实际上有几件事:它是一个使用 Nix 包管理器的 Linux 发行版。Nixpkgs 是超过 80,000 个软件包的集合,可以使用 Nix 软件包管理器进行安装。

使用 Nix 包管理器安装 Nixpkgs。

Nix 有三个独立的手册:Nix 手册、Nixpkgs 手册和 NixOS 手册。

还有一本 Nix 参考手册。

一个社区维护的非官方 NixOS Wiki 可用,Nix 开发站点位于 nix.dev。NixOS Wiki 上有关于软件包管理器、Nix 语言、Nixpkgs 和 NixOS 本身的信息。

还有一种 Nix 语言可用于为新安装创建和复制部分软件包。

在开始安装和使用 Nix 之前,您可能至少需要阅读整个 Nix 手册。

58121-118603-manuals-xl
Nix 文档。

定义

要使用 Nix,您需要了解一些新术语。

Nix 基于声明式编程 – 基于描述一个软件应该做什么而不是如何做来创建程序。长话短说,声明式编程试图避免基于状态和变化状态的软件来实现某种结果。

表达式。Nix 表达式基本上是可安装软件的子组件,这些子组件是预定义的,以便以后检索和安装。表达式的想法是组件已经定义,因此当它安装时,它在所有系统中的工作方式相同。

每个表达式还具有搜索路径。

频道。Nix 通道是一个或多个预定义 Nix 表达式的特定路径,可以远程检索和安装这些表达式。channels.nixos.org 有一个官方频道列表。

大多数频道都有版本。频道也可以订阅或取消订阅。

每个频道都有可下载的内容,这些内容在安装频道时安装。

商店。与 Homebrew 和 UNIX 本身不同,Nix 不会将软件包安装到标准的 UNIX 目录中,例如 /usr、/bin、/sbin 或 /opt。

相反,它会创建自己的存储 – 一个特殊的目录和卷,用于存储所有已安装的软件包。通过使用商店,Nix 包的可移植性要强得多,因为整个商店可以作为一个单元移动。

Nix 确实会将配置文件安装到 中,除非您打开 macOS Finder 的隐藏文件功能,否则该文件通常是不可见的。/etc/nixos/configuration.nix

Flakes 是一个实验性的 Nix 特性,它是用于定义和控制包之间的依赖关系的文件。虽然很受欢迎,但 Nix 薄片仍处于实验阶段,缺乏强大的文档,因此使用它们的风险自负。

垃圾回收。就像在某些编程环境中一样,当你删除一个 Nix 包时,它实际上不会立即被卸载。为此,请运行 Nix 垃圾回收器

将垃圾回收器视为在后台静默运行的进程,该进程会清理不再需要的任何未使用或过时的组件。

许多现代系统都使用垃圾回收器,包括 Java VM,以及 Apple 的 Swift 和 Objective-C 运行时。

在终端中安装后,您可以使用以下命令随时调用 Nix 垃圾回收器:

nix-collect-garbage

命令行工具

Nix 安装包括多个命令行工具 (CLI),您可以从终端应用程序运行这些工具。这些包括:

  1. nix-env– 用于操纵 Nix 用户环境
  2. nix-build– 用于构建 Nix 表达式
  3. nix-shell– 基于 Nix 表达式的交互式命令环境
  4. nix-store– 操作或查询 Nix 存储

所有这些命令以及更多命令都在 Nix 手册中进行了详细说明。

Nix 用户环境只是 Nix 安装的一组软件和工具。

安装 Nix

Nix 通常安装到 macOS Catalina,但从 macOS Catalina 开始,macOS 启动盘的根目录是只读的。/nix

取而代之的是,在后 Catalina 系统上,Nix 将创建一个新卷来保存 Nix 存储,并将其作为卷装载到启动盘根目录下的隐藏 macOS 文件夹中。Volumes

如果您具有管理员访问权限,则安装程序将在您运行它时提示您输入 sudo(超级用户)权限,以便创建新卷。

要在终端中运行交互式 Nix 安装程序,请键入:

curl -L https://nixos.org/nix/install |SH公司

然后按 Return 键

当安装程序运行时,它会给你一条简短的消息,告诉你它要做什么以及安装位置。它还为用户创建新的 UNIX 用户和 UUID,这些用户和 UUID 在 Nix 容器和包构建期间使用。

Nix 安装程序将对 Nix 存储卷的引用存储在 中。/etc/fstab

请注意,Nix 商店卷挂载,但不是在 Finder 的桌面上 – 您不会在 Mac 的桌面上看到它,但它仍然存在。

相反,Nix 会将其挂载在启动盘根目录下的名为“Nix Store”的目录中。在这个目录中,有一个 store 和一个 var 文件夹。

store 文件夹包含 NIX 下载和安装的所有软件包和通道,var 文件夹包含日志文件夹,nix 文件夹包含数据库、配置文件、与后台守护程序的连接、用户池和其他部分。

58121-118779-store-xl
启动磁盘根目录下的 NIX 存储卷。

fstab是文件系统表文件,它告诉 UNIX 所有文件系统及其卷所在的位置。

当您准备好继续安装时,请在“终端”中输入管理员密码,然后按下 Return 键

您将看到 Nix 安装程序正在运行,并且它将描述它正在创建的内容。

如果安装的 Nix 具有 sudo 访问权限,它还会尝试将一些配置选项添加到 Mac 启动盘上的用户和文件夹中的隐藏用户配置文件中,即:etc

/etc/bashrc /etc/profile.d/nix.sh /etc/zshrc /etc/bash.bashrc /etc/zsh/zshrc

当您登录时,macOS 会加载这些配置文件,它们包含环境变量和已安装软件的路径。

最后,Nix 安装程序设置一个后台进程,或名为守护进程,用于在后台静默管理 Nix 存储。nix-daemon

安装程序完成后,您需要退出终端并重新打开它,或者打开一个新的终端 shell,以便终端加载所有新的 Nix 配置。

安装程序完成后,您可以使用以下命令初始化默认的 Nix 软件包,并在终端中测试 Nix 安装:

nix-shell -p nix-info --run "nix-info -m"

您应该会看到一条关于获取路径的消息,然后是本地 Nix 存储中安装的所有软件包的列表。

在消息的底部,您应该会看到当前的 Nix 和 Darwin 版本号、通道名称以及包配置文件的路径。

您还可以使用命令后跟软件包名称,在终端中手动安装任何现有的 Nix 软件包。例如:nix-env --install

nix-env --install firefox

软件包卸载是相同的,只是您使用命令的标志--uninstallnix-env

其他资源

有几个不错的第三方 Nix 网站可用 – 请务必查看它们。

Zero-to-nix.com 是 Nix 的使用指南,包括一个快速入门和一个概念部分,其中很好地概述了 Nix 的每个部分以及它们如何组合在一起。

Determinate.systems 是一个以 Nix 为中心的站点,其中包含许多 Nix 教程以及一个独立的 Nix 安装程序,以防您不想使用基于终端的安装。

Ryan Yin 的 Nix and Flakes Book 是一个面向初学者的在线教程和 GitHub 存储库,其中包含与 Nix 相关的有用信息。

nix-darwin 存储库包含 Nix 软件包管理器的 Darwin (macOS) 移植的所有模块、软件包和文档。

Nixpacks 是一个实用程序,可以获取任何文件目录并将其容器化以供重用。

最后,请务必访问 opencontainers.org 的开放容器计划。

Nix 的优点和缺点

一旦你通过了学习曲线,Nix 就会非常有效和有用。跨系统配置和重新安装可移植容器的能力非常强大。

您可以配置任何一组环境和工具,然后将其打包以在大多数系统上重新部署。

创建自己的自定义 Nix 包和容器的能力,然后可以重复使用,在您需要配置新机器时节省大量时间。

Nix 作为包管理器的主要缺点是增加了复杂性和学习曲线。目前也没有 Windows 版本。

Homebrew 仍然比 Nix 简单,但除了编写自己的自定义 shell 脚本进行安装外,Homebrew 缺乏可移植性。尝试为每个可能的系统编写自定义安装 shell 脚本是不切实际的。

一旦你学习并掌握了 Nix,它将成为你开发武器库中的强大工具。

未经允许不得转载:表盘吧 » 如何使用 Nix 在 macOS 上安装软件