为什么 `nix-env -q` 找不到我安装的包? (NixOS 频道、配置文件和软件包)

Why doesn't `nix-env -q` find my installed packages? (NixOS channels, profiles and packages)

我最近安装了 NixOS,最后得到了 3 个配置文件:

我发现系统配置文件使用稳定频道,我(布鲁诺配置文件)使用不稳定频道很方便:

~> nix-channel --list
unstable https://nixos.org/channels/nixos-unstable
~> sudo nix-channel --list
nixos https://nixos.org/channels/nixos-17.09

然后我通过 /etc/nixos/configuration.nix 声明性地安装了一些包:

environment.systemPackages = with pkgs; [
   firefox
   chromium
   htop
   # ...
];

还有一些命令式:nix-env --install firefox

现在列出我安装的软件包,我希望还能看到系统配置文件提供的那些(因为它们在我的用户配置文件中可用):

~> htop --version
htop 2.0.2 - (C) 2004-2016 Hisham Muhammad
Released under the GNU GPL.

~> nix-env -q | grep htop
~> nix-env -q | grep firefox
firefox-57.0

只列出了 Firefox。让我们尝试使用根配置文件:

~> sudo nix-env -q | grep htop

同样的事情,它实际上完全是空的。 也许使用系统配置文件:

~> sudo nix-env -p /nix/var/nix/profiles/system -q

仍然没有。

来自传统的包管理器(Debian、Red Hat),我感到困惑的是 Nix 被定义为“纯功能包管理器”似乎没有提供通用查询包的工具 - nix-env 是在整个手册中都提到过,感觉就像 Debian apt 的另一个自我。

是否有这样的工具,或者这不是问题,也就是说,人们通常可以接受 profiles/environments 中没有所有软件包的列表?

nix-env -q 只会报告安装到命令式 'environments' 中的软件包,例如 nix-env -i.

创建的软件包

nix-env 是一个用于命令式包管理的工具,它是声明式和不可变的 Nix 系统之上的一个薄层。 profiles 机制提供了一种可变性方法,nix-env 在配置文件中创建 manifest.nix 以记录环境中的包集。

NixOS 系统仅使用 profiles 但不提供 manifest.nix 文件。这是有道理的,因为 NixOS 系统每次都会从头开始重建,这使得它具有很好的声明性。

因此 nix-env 无法查询 NixOS 配置文件。

因此,nix-env -q 查询您的命令式安装的用户包。 sudo nix-env -q 显示由 root 强制安装的那些,其中不包括您的 NixOS 软件包,因为它们是您系统的一部分,以声明的方式。将 nix-env -q -p 指向您的 NixOS 系统会给出一个空列表,因为它不是 nix-env.

创建的环境

您的用户可以使用系统命令的原因不是因为系统是用户配置文件中 (Nix) 环境的一部分,而是因为您的 (UNIX) 环境变量指向两个配置文件。

$ which firefox
/home/user/.nix-profile/bin/firefox
$ which cp
/run/current-system/sw/bin/cp
$ echo $PATH
[...]

要了解您的系统上安装了什么,您可以运行以下命令:

  • nix-env -q 弄清楚在命令式用户环境中安装了什么。
  • nixos-option environment.systemPackages 以查询在构建和激活配置时将出现在 /run/current-system/sw 中的软件包集。引用它的文档,“这些包自动提供给所有用户。”
  • nix-store -q --requisites /run/current-system ~/.nix-profile当前系统和你的用户配置文件的依赖组合关闭
  • nix-store -q --references /run/current-system当前系统的直接依赖

有关更多选项,请参阅 --query 部分或 nix-store --help