Что означает строка / значение <nixpkgs> в Nix?

Например, в следующем (которое я предполагаю, является никс-выражением):

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

Что значит <nixpkgs> ссылка? Я также вижу, что он используется в других контекстах, например:

nix-shell '<nixpkgs>' -A linuxPackages.kernel

1 ответ

Решение

<nixpkgs> является выражением Nix, которое оценивается путем просмотра пути поиска Nix в NIX_PATH переменная окружения и / или -I вариант.

Это описано более подробно в руководстве Nix.

Обратите внимание, что путь поиска Nix нецелесообразен во многих ситуациях. Вы можете только передать это снаружи, и это легко создает нечистоту. По моему опыту, проблемы лучше решать с помощью явной передачи аргументов или функций, связанных с фиксированными точками, такими как callPackage и система наложения.

Например, NixOS имеет только один дополнительный параметр пути поиска, и он читается только один раз nixos/default.nix если не указана явная конфигурация. Таким образом, у вас есть возможность предоставить собственную конфигурацию, поэтому вы (nix-build) и hydra могут уверенно создавать тесты виртуальных машин NixOS, загрузочные образы, образы докеров и т. д.

Из руководства Nix, 15.1. Значения, раздел "Простые значения":

Пути также могут быть указаны между угловыми скобками, например. Это означает, что каталоги, перечисленные в переменной среды NIX_PATH будет произведен поиск заданного имени файла или каталога.

Из руководства NixOS, Глава 18. Переменные общей среды, раздел 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 а также /etc/nixos/nixpkgs/path,

Если путь в пути поиска Nix начинается с http:// или же https://, он интерпретируется как URL-адрес архива, который будет загружен и распакован во временную папку. Тарбол должен состоять из одного каталога верхнего уровня. Например, настройка 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, которая имеет приоритет над 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, 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 <---
# (...)

Если мое понимание верно, после import предоставленное выражение Nix оценивается с пустым набором атрибутов ({}). Результатом является список атрибутов, а with выражение будет включать все содержащиеся в нем атрибуты в локальной лексической области.

2. nix repl '<nixpkgs/nixos>'

Пример взят из руководства NixOS, 5.3. Модульность, показывающая активные настройки конфигурации NixOS в репл.

Из-за <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

Разнообразный

Можно оценить значение, используя 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
Другие вопросы по тегам