为什么 `nix-env -q` 找不到我安装的包? (NixOS 频道、配置文件和软件包)
Why doesn't `nix-env -q` find my installed packages? (NixOS channels, profiles and packages)
我最近安装了 NixOS,最后得到了 3 个配置文件:
- bruno(用户个人资料),
- 默认(由 root 使用),并且
- 系统(由 NixOS 使用)。
我发现系统配置文件使用稳定频道,我(布鲁诺配置文件)使用不稳定频道很方便:
~> 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
。
我最近安装了 NixOS,最后得到了 3 个配置文件:
- bruno(用户个人资料),
- 默认(由 root 使用),并且
- 系统(由 NixOS 使用)。
我发现系统配置文件使用稳定频道,我(布鲁诺配置文件)使用不稳定频道很方便:
~> 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
。