Что означает строка / значение <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
Разнообразный
- Проблема № 338 все еще открыта для улучшения руководства Nix, документирующего синтаксис углов в их собственном разделе.
- Разделы Nix Pills (например, 15.5. Заключение и глава 16. Параметры Nixpkgs) последовательно называют синтаксис угловых "угловых скобок".
- В своем ответе Роберт Хенсинг предостерегает от использования
<nixpkgs>
повсюду, и вопрос № 1161 по-прежнему открыт только по этой теме. (Выдержка: " У нас есть неофициальное руководство, согласно которому никто не должен использовать угловые скобки в nixpkgs, но почему бы не сделать это жестким требованием? ")
Можно оценить значение, используя 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