来自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/path> 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 <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,导入路径,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 '<nixpkgs/nixos>'
来自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
由于<nixpkgs/path> 约定(其中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
杂项