NixOS频道,配置文件和包

时间:2017-12-23 15:51:38

标签: nixos

我最近安装了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的改变了自我。 是否有这样的工具,或者这是一个非问题,也就是说,人们通常没有列出所有包含在配置文件/环境中的包?

1 个答案:

答案 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}}部分。