【问题标题】:Why doesn't `nix-env -q` find my installed packages? (NixOS channels, profiles and packages)为什么 `nix-env -q` 找不到我安装的软件包? (NixOS 频道、配置文件和软件包)
【发布时间】:2018-06-05 20:05:35
【问题描述】:

我最近安装了 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 的另一个自我。

是否有这样的工具,或者这不是一个问题,也就是说,人们通常不会有跨配置文件/环境的所有包的列表吗?

【问题讨论】:

    标签: nixos


    【解决方案1】:

    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 包,因为它们是你系统的一部分,以声明的方式。将 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 了解更多选项。

    【讨论】:

    • 谢谢。您的第二段对我来说不是很清楚:“建立在 Nix 的功能概念之上”对于 NixOS 也是如此。 “内置于 Nix 的功能部分”听起来很模糊,因为在 nixos.org Nix 被定义为“纯粹的功能包管理器”。我感到困惑的是,作为“包管理器”的 Nix 应该提供一种查询包的方法,无论它们是通过 nix-env 还是 NixOS 安装的。
    • 我已经用最后一段编辑了我的问题。我给你 +1 但不接受这一点,因为我觉得可能会有更多解释:)
    • 我已经扩展了令人困惑的段落并添加了一些可能对您有所帮助的命令
    • 再次感谢,这很有帮助!
    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2017-05-26
    相关资源
    最近更新 更多