nix-env: понимание доступных путей атрибутов в активном выражении Nix - PullRequest
2 голосов
/ 12 июня 2019

В моей машине NixOS я могу использовать nix-env для запроса пакета ghc двумя способами:

Один - nix-env -f '<nixpkgs>' -qaP ghc, что приводит к выводу

ghc  ghc-8.6.5

Другим является nix-env -qaP ghc, что приводит к выводу

nixpkgs.ghc  ghc-8.6.5

Во втором случае я хотел бы понять, почему у активного выражения Nix есть корневой атрибут nixpkgs.

Содержимое папки ~/.nix-defexpr и нескольких подпапок выглядит следующим образом:

enter image description here

Как собирается активное выражение Nix изсодержание ~/.nix-defexpr?Почему нет корневого атрибута channels?Происходит ли имя корневого атрибута nixpkgs от имени папки nixpkgs или от содержимого папки, возможно, от чего-то, объявленного в файле default.nix?

1 Ответ

2 голосов
/ 13 июня 2019

Руководство 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'
...