什么是 Nix中的字符串/值是什么意思?

问题描述 投票:4回答:3

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

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

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

nix-shell '<nixpkgs>' -A linuxPackages.kernel
nix nixos
3个回答
4
投票

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

它在Nix manual中有更详细的描述。

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

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


0
投票

可以使用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

0
投票

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/pathpath/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 */

例子

1. <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>'将在本地词法范围中包含其所有包含的属性。

2. NixOS manual, 5.3. Modularity

<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

© www.soinside.com 2019 - 2024. All rights reserved.