我最近安装了NixOS,最终得到了3个配置文件:bruno(用户配置文件),默认(root用户)和系统(由NixOS使用)。
我发现为系统配置文件使用稳定通道和为我设置不稳定通道(bruno配置文件)很方便:
~> 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的改变了自我。 是否有这样的工具,或者这是一个非问题,也就是说,人们通常没有列出所有包含在配置文件/环境中的包?
答案 0 :(得分:5)
nix-env -q
只会报告安装在命令性环境中的软件包,例如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软件包,因为它们是您的系统的一部分,以声明方式。在您的NixOS系统中指向nix-env -q -p
会给出一个空列表,因为它不是由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
的{{1}}部分。