代码之家  ›  专栏  ›  技术社区  ›  Bruno Bieth

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

  •  8
  • Bruno Bieth  · 技术社区  · 7 年前

    我最近安装了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 回复  |  直到 4 年前
        1
  •  11
  •   rofrol    3 年前

    nix-env -q 只报告安装到命令式“环境”中的包,如 nix-env -i .

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

    NixOS系统仅使用 配置文件 但不提供 显示尼克斯 文件这很有意义,因为每次都会从头开始重建NixOS系统,这使得它具有很好的声明性。

    因此 nix环境 无法查询NixOS配置文件。

    所以 nix环境-q 查询强制安装的用户包。 sudo nix-env -q 显示了那些必须由root安装的程序,其中不包括您的NixOS包,因为它们是您系统的一部分。磨尖 nix-env -q -p 在您的NixOS系统中,会给出一个空列表,因为它不是由 nix环境 .

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

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

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

    • nix环境-q 了解在强制用户环境中安装了什么。
    • nixos-option environment.systemPackages 在构建和激活配置时,查询将出现在/运行/当前系统/软件中的软件包集。引用其文档,“所有用户都可以自动使用这些软件包。”
    • nix-store -q --requisites /run/current-system ~/.nix-profile 当前系统和用户配置文件的依赖关系的组合关闭
    • nix-store -q --references /run/current-system 当前系统的直接依赖关系

    看见 --query 截面或 nix-store --help 查看更多选项。