例如,在下面(我假设是一个nix表达式):
(import <nixpkgs> {}).haskellPackages.ghcWithPackages (hpkgs: with hpkgs; [
lens
aeson
turtle
])
<nixpkgs>
参考什么?我也看到它在其他上下文中使用,例如:
nix-shell '<nixpkgs>' -A linuxPackages.kernel
<nixpkgs>
是一个Nix表达式,通过查看NIX_PATH
环境变量和/或-I
选项中的Nix搜索路径来评估。
它在Nix manual中有更详细的描述。
请注意,在许多情况下,Nix搜索路径是不切实际的。你只能从外面传递它,它很容易产生杂质。根据我的经验,通过明确的参数传递或与callPackage
和覆盖系统等固定点相关的函数可以更好地解决问题。
例如,NixOS只有一个额外的搜索路径参数,如果没有给出明确的配置,它只在nixos/default.nix
中读取一次。这样,您就可以灵活地提供自己的配置,这就是为什么您(nix-build
)和hydra可以放心地构建NixOS VM测试,可启动映像,docker镜像等的原因。
可以使用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
从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在
<nixpkgs/
和>
中搜索/home/eelco/Dev/nixpkgs-branch/path
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
优先于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
# ^^^^^^^
:
<nixpkgs>
因为default.nix
评估为“目录,所以该目录中的文件import
被加载”由Nix manual, 15.4.1. Advanced Attributes。 ($ 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 <---
# (...)
,section import path,builtins.import path)
import
如果我的理解是正确的,在{}
之后,使用空属性集(with
expression)评估提供的Nix表达式。结果是属性列表,nix repl '<nixpkgs/nixos>'
将在本地词法范围中包含其所有包含的属性。
从<nixpkgs/
获取的示例,显示repl中的活动NixOS配置设置。
由于>
pathnixos
约定,其中path等于/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
评估:
Issue #338
<nixpkgs>
警告不要在任何地方使用issue #1161,并且We have an unofficial guideline that nobody should use angle brackets in nixpkgs, but why not make it into a hard requirement?仍然在这个主题上开放。 (节选:“qazxswpoi”)