<nixpkgs>字符串/值在Nix中是什么意思?

Chr*_*ski 5 nixos nix

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

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

什么<nixpkgs>参考?我还看到它在其他上下文中使用,例如:

nix-shell '<nixpkgs>' -A linuxPackages.kernel
Run Code Online (Sandbox Code Playgroud)

tor*_*tte 6

来自Nix 手册,5.2.1。值,“简单值”部分:

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

来自NixOS 手册,7.2。公共环境变量,部分NIX_PATH

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

/home/eelco/Dev:/etc/nixos
Run Code Online (Sandbox Code Playgroud)

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

nixpkgs=/home/eelco/Dev/nixpkgs-branch:/etc/nixos
Run Code Online (Sandbox Code Playgroud)

将导致 Nix 搜索和中的 <nixpkgs/路径>/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
Run Code Online (Sandbox Code Playgroud)

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

可以使用以下简写来引用官方渠道:

nixpkgs=channel:nixos-15.09
Run Code Online (Sandbox Code Playgroud)

可以使用-I 选项扩展搜索路径,该选项优先于NIX_PATH.

例子

1.with import <nixpkgs> {}; /* rest of the expression */

就我而言,<nixpkgs>/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
#                                  ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

因为<nixpkgs>计算结果为“一个目录,该目录中的文件由default.nix加载import。(Nix手册,15.4.1.高级属性,部分导入路径,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 <---
# (...)
Run Code Online (Sandbox Code Playgroud)

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

2.nix repl '<nixpkgs/nixos>'

示例取自NixOS 手册 5.3。模块化,显示 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
Run Code Online (Sandbox Code Playgroud)

在 repl 上加载系统 NixOS 配置:

nix-repl> :l <nixpkgs/nixos>
Added 6 variables.
Run Code Online (Sandbox Code Playgroud)

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

nix-repl> :l <nixpkgs>
Added 10089 variables.
Run Code Online (Sandbox Code Playgroud)

或者直接将它们加载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.
Run Code Online (Sandbox Code Playgroud)

备忘单:

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
Run Code Online (Sandbox Code Playgroud)

由于<nixpkgs/路径>约定(其中路径等于nixos),角度表达式的计算结果为/nix/var/nix/profiles/per-user/root/channels/nixos/nixos。上面的ll输出还显示了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
Run Code Online (Sandbox Code Playgroud)

各种各样的


Rob*_*ing 5

<nixpkgs>是通过查看NIX_PATH环境变量和/或-I选项中的 Nix 搜索路径来评估的 Nix 表达式。

Nix 手册中有更详细的描述。

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

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