【问题标题】:What does the <nixpkgs> string / value mean in Nix?Nix 中的 <nixpkgs> 字符串/值是什么意思?
【发布时间】:2018-05-02 22:37:23
【问题描述】:

例如在下面(我假设它是一个 nix 表达式):

(import <nixpkgs> {}).haskellPackages.ghcWithPackages (hpkgs: with hpkgs; [
    lens
    aeson
    turtle
])

&lt;nixpkgs&gt; 指的是什么?我还看到它在其他情况下使用,例如:

nix-shell '<nixpkgs>' -A linuxPackages.kernel

【问题讨论】:

    标签: nix nixos


    【解决方案1】:

    来自Nix manual, 15.1. Values,“简单​​值”部分:

    也可以在尖括号之间指定路径,例如. 这意味着环境变量中列出的目录 将在NIX_PATH 中搜索给定的文件或目录名称。

    来自NixOS manual, Chapter 18. Common Environment Variables,部分NIX_PATH

    用于查找 Nix 表达式的以冒号分隔的目录列表 括在尖括号中(即,)。例如,值

    /home/eelco/Dev:/etc/nixos
    

    将导致 Nix 查找相对于 /home/eelco/Dev 的路径和 /etc/nixos,按此顺序。也可以匹配路径 反对前缀。例如,值

    nixpkgs=/home/eelco/Dev/nixpkgs-branch:/etc/nixos
    

    将导致 Nix 搜索 &lt;nixpkgs/path&gt; in /home/eelco/Dev/nixpkgs-branch/path/etc/nixos/nixpkgs/path

    如果 Nix 搜索路径中的路径以 http://https:// 开头, 它被解释为将下载的 tarball 的 URL,并且 解压到临时位置。 tarball 必须包含一个 顶级目录。例如,将NIX_PATH 设置为

    nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-15.09.tar.gz
    

    告诉 Nix 下载 Nixpkgs/NixOS 15.09 中的最新版本 频道。

    官方频道可使用以下简写方式:

    nixpkgs=channel:nixos-15.09
    

    可以使用-I option 扩展搜索路径,这需要 优先于NIX_PATH

    示例

    1。 with import &lt;nixpkgs&gt; {}; /* rest of the expression */

    就我而言,&lt;nixpkgs&gt;/nix/var/nix/profiles/per-user/root/channels/nixos

    $ echo $NIX_PATH 
    #                                  VVVVVVV
    /home/a_user/.nix-defexpr/channels:nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels
    #                                  ^^^^^^^
    

    因为&lt;nixpkgs&gt; 评估为“一个目录,该目录中的文件default.niximport 加载”。 (Nix manual, 15.4.1. Advanced Attributes导入路径,builtins.import 路径部分)

    $ ll /nix/var/nix/profiles/per-user/root/channels/nixos
    lrwxrwxrwx 1 root root 80 Dec 31  1969 /nix/var/nix/profiles/per-user/root/channels/nixos -> /nix/store/ywlfq2ns4
    a3fzb2ap74lvahmrg1p0lmk-nixos-19.03.172231.7b36963e7a7/nixos/
    
    $ ll $(readlink -f /nix/var/nix/profiles/per-user/root/channels/nixos)
    total 3308
    dr-xr-xr-x  8 root root    4096 Dec 31  1969 ./
    dr-xr-xr-x  4 root root    4096 Dec 31  1969 ../
    # (...)
    dr-xr-xr-x  7 root root    4096 Dec 31  1969 nixos/
    dr-xr-xr-x 17 root root    4096 Dec 31  1969 pkgs/
    -r--r--r--  1 root root    1097 Dec 31  1969 COPYING
    -r--r--r--  1 root root     968 Dec 31  ---> default.nix <---
    # (...)
    

    如果我的理解是正确的,在import 之后,提供的 Nix 表达式会使用一个空属性集 ({}) 进行评估。结果是一个属性列表,with expression 将在本地词法范围内包含其所有包含属性。

    2。 nix repl '&lt;nixpkgs/nixos&gt;'

    来自NixOS manual, 5.3. Modularity 的示例,显示了 repl 中的活动 NixOS 配置设置。

    # On NixOS 19.03
    
    $ nix repl
    
    Welcome to Nix version 2.2.2. Type :? for help.
    
    nix-repl> <nixpkgs>
    /nix/var/nix/profiles/per-user/root/channels/nixos
    
    nix-repl> <nixpkgs/nixos>
    /nix/var/nix/profiles/per-user/root/channels/nixos/nixos
    

    在 repl 上加载系统 NixOS 配置:

    nix-repl> :l <nixpkgs/nixos>
    Added 6 variables.
    

    从 repl 上的 Nixpkgs 加载所有 Nix 表达式:

    nix-repl> :l <nixpkgs>
    Added 10089 variables.
    

    或将它们直接加载 repl:

    $ nix repl '<nixpkgs>'
    
    Welcome to Nix version 2.2.2. Type :? for help.
    
    Loading '<nixpkgs>'...
    Added 10089 variables.
    
    $ nix repl '<nixpkgs/nixos>'
    
    Welcome to Nix version 2.2.2. Type :? for help.
    
    Loading '<nixpkgs/nixos>'...
    Added 6 variables.
    

    备忘单:

    nix-repl> :help
    The following commands are available:
    
      <expr>        Evaluate and print expression
      <x> = <expr>  Bind expression to variable
      :a <expr>     Add attributes from resulting set to scope
      :b <expr>     Build derivation
      :i <expr>     Build derivation, then install result into current profile
      :l <path>     Load Nix expression and add it to scope
      :p <expr>     Evaluate and print expression recursively
      :q            Exit nix-repl
      :r            Reload all files
      :s <expr>     Build dependencies of derivation, then start nix-shell
      :t <expr>     Describe result of evaluation
      :u <expr>     Build derivation, then start nix-shell
    

    由于&lt;nixpkgs/path&gt; 约定(其中path 等于nixos),角度表达式将计算为/nix/var/nix/profiles/per-user/root/channels/nixos/nixos。上面的ll 输出还显示了nixos 上面的nixos 文件夹default.nix,里面确实有另一个default.nix 将被nix repl 评估:

    $ ll $(readlink -f /nix/var/nix/profiles/per-user/root/channels/nixos/nixos)
    total 72
    dr-xr-xr-x  7 root root  4096 Dec 31  1969 ./
    dr-xr-xr-x  8 root root  4096 Dec 31  1969 ../
    -r--r--r--  1 root root   886 Dec 31  ---> default.nix <---
    -r--r--r--  1 root root   197 Dec 31  1969 README
    -r--r--r--  1 root root  6074 Dec 31  1969 release-combined.nix
    -r--r--r--  1 root root  9251 Dec 31  1969 release.nix
    -r--r--r--  1 root root  2038 Dec 31  1969 release-small.nix
    

    杂项

    【讨论】:

      【解决方案2】:

      可以使用nix repl 评估值:

       nix repl
      Welcome to Nix version 2.1.3. Type :? for help.
      
      nix-repl> <nixpkgs>
      /nix/var/nix/profiles/per-user/root/channels/nixos
      

      【讨论】:

      • 只是为了确认我已经理解解析路径实际包含的内容:在 OP 的第二个示例中,是(最新的)nix 表达式 - 关于您订阅的频道 - 用于 linuxPackages.kernel下载并解压以在 shell 环境中使用?我现在对上述答案之一中的以下变量究竟是什么感到困惑,例如nix-repl&gt; :l &lt;nixpkgs&gt; Added 10089 variables.
      • 我不确定你所说的 OP 的第二个示例是什么意思。究竟是哪个值/文本?
      【解决方案3】:

      &lt;nixpkgs&gt; 是一个 Nix 表达式,通过查看 NIX_PATH 环境变量和/或 -I 选项中的 Nix 搜索路径来评估。

      Nix manual中有更详细的描述。

      请注意,Nix 搜索路径在许多情况下是不切实际的。你只能从外面通过,它很容易产生杂质。根据我的经验,通过显式参数传递或与固定点相关的函数(如 callPackage 和覆盖系统)可以更好地解决问题。

      例如,NixOS 只有一个额外的搜索路径参数,如果没有给出明确的配置,它只会在nixos/default.nix 中读取一次。这样,您可以灵活地提供自己的配置,这就是为什么您 (nix-build) 和 hydra 可以自信地构建 NixOS VM 测试、可启动映像、docker 映像等。

      【讨论】:

      • 评估结果是什么?包的集合?这是官方的 nixpkgs 存储库,还是系统“nix”配置或其他什么?
      • 它解析为一个路径。该值由NIX_PATH(以及可选的-I)确定。在你的 shell 中尝试echo $NIX_PATH,看看你的配置是如何的。对我来说&lt;nixpkgs&gt; 解析为/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs。我在 NixOS 上,所以这是系统 nixpkgs。
      • @RobertHensing 只是为了确认我已经理解解析路径实际包含的内容:在 OP 的第二个示例中,是(最新的)nix 表达式 - 相对于您订阅的频道 - 用于 @ 987654333@下载解压后可以在shell环境中使用?
      • @mikerover 不确定我是否完全理解这个问题。 OP 的第二个示例等同于 nix-shell --expr '(import &lt;nixpkgs&gt; {}).linuxPackages.kernel',并为您提供了一个可用于手动解包和构建 Linux 内核的 shell。
      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      相关资源
      最近更新 更多