Руководство Nix содержит некоторую информацию о том, как собирается .nix-defexpr
:
Выражения Nix в этом каталоге объединены в один набор, в котором каждый файл представляет собойАтрибут с именем файла.
Не упоминается, что происходит, если содержимое является каталогами.Но я обнаружил эту проблему GitHub , которая объясняет вещи немного больше:
- Если каталог является допустимым выражением (то есть имеет default.nix), его выражение будет добавленок набору, в противном случае он будет проходить рекурсивно.
- Имена промежуточных каталогов полностью игнорируются (т.е. не принимают участия в attrpaths).
- manifest.nix рекурсивно игнорируется.
Итак, корневого атрибута channels
нет, поскольку в папке нет выражения default.nix
.
Ok.Затем в качестве эксперимента я создал папку .nix-defexpr/foo
с файлом default.nix
с содержимым { zzz = 4; }
внутри.Когда я выполняю nix-env --install -A foo.zzz
, я получаю:
error: expression does not evaluate to a derivation (or a set or list of those)
Это означает, что он действительно нашел путь!Проблема в том, что 4
не является производным.
Но что, если я создаю другую папку .nix-defexpr/whatever
и помещаю туда копию папки foo
?Не будет ли какого-то столкновения имен?Да, есть:
8f792ff4f96a:~# nix-env --install -A foo.zzz
warning: name collision in input Nix expressions, skipping '/root/.nix-defexpr/whatever/foo'