例如以下(我假设是一个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)
来自Nix 手册,5.2.1。值,“简单值”部分:
路径也可以在尖括号之间指定,例如 。这意味着将在环境变量中列出的目录中
NIX_PATH搜索给定的文件或目录名。
来自NixOS 手册,7.2。公共环境变量,部分NIX_PATH:
以冒号分隔的目录列表,用于查找尖括号(即 )中的 Nix 表达式。例如,值
Run Code Online (Sandbox Code Playgroud)/home/eelco/Dev:/etc/nixos将导致 Nix 按顺序查找相对于
/home/eelco/Dev和 的 路径。/etc/nixos还可以将路径与前缀进行匹配。例如,值Run Code Online (Sandbox Code Playgroud)nixpkgs=/home/eelco/Dev/nixpkgs-branch:/etc/nixos将导致 Nix 搜索和中的
<nixpkgs/路径。>/home/eelco/Dev/nixpkgs-branch/path/etc/nixos/nixpkgs/path如果 Nix 搜索路径中的路径以
http://或开头https://,则它将被解释为将下载并解压到临时位置的 tarball 的 URL。tarball 必须包含一个顶级目录。例如,设置NIX_PATH为Run Code Online (Sandbox Code Playgroud)nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-15.09.tar.gz告诉 Nix 在 Nixpkgs/NixOS 15.09 频道下载最新版本。
可以使用以下简写来引用官方渠道:
Run Code Online (Sandbox Code Playgroud)nixpkgs=channel:nixos-15.09可以使用-I 选项扩展搜索路径,该选项优先于
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
# ^^^^^^^
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表达式将在本地词法范围中包含所有包含它的属性。
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)
<nixpkgs>,并且关于该主题的问题 #1161仍然悬而未决。(摘录:“我们有一个非官方指南,规定任何人都不应该在 nixpkg 中使用尖括号,但为什么不将其作为硬性要求呢? ”)<nixpkgs>是通过查看NIX_PATH环境变量和/或-I选项中的 Nix 搜索路径来评估的 Nix 表达式。
在Nix 手册中有更详细的描述。
请注意,Nix 搜索路径在许多情况下是不切实际的。只能从外面通过,容易产生杂质。根据我的经验,通过显式参数传递或与固定点callPackage和覆盖系统等相关的函数可以更好地解决问题。
例如,NixOS 只有一个额外的搜索路径参数,nixos/default.nix如果没有给出明确的配置,它只会被读取一次。这样,您就可以灵活地提供自己的配置,这就是为什么您 ( nix-build) 和 hydra 可以自信地构建 NixOS VM 测试、可启动映像、docker 映像等。
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |