nix скопировать nixpkgs с определением оверлеев

avatar
trevor cook
1 июля 2021 в 16:49
160
1
1

Есть ли способ восстановить набор пакетов, созданный nixpkgs с оверлеями, таким образом, чтобы он был совместим с nix copy?

Возьмите, например, следующие операторы в nix repl

overlays = [(self: super: {aardvark = "does aardvark";})]
pkgs = import <nixpkgs> { inherit overlays; }
pkgs2 = import pkgs.path {}
pkgs3 = import pkgs.path { inherit (pkgs) overlays; }

pkgs.aardvark существует и был помещен туда с помощью наложения, но если я попытаюсь повторно импортировать полученный путь pkgs, я импортирую только магазинную версию <nixpkgs>.

pkgs3.aardvark также существует, но это не то решение, которое мне нужно.

Я намереваюсь использовать nix copy из pkgs с наложениями. Я могу скопировать определение pkgs.path, но не оверлеи, поскольку это список лямбда-выражений, а не путей. Я надеюсь на действительно простое решение, например, вместо pkgs.path есть атрибут типа pkgs.drv или pkgs.out, который можно импортировать, например, с помощью import pkgs.out и доставляет переопределенный набор пакетов.

Источник

Ответы (1)

avatar
Robert Hensing
1 июля 2021 в 19:24
1

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

Сделав шаг назад, возможно, лучше либо отправить встроенные замыкания, либо поделиться репозиторием git. Доставка встроенных замыканий — это то, что делает NixOps, и имеет то преимущество, что все может быть определено в одном процессе оценки Nix, но не позволяет пользователям машины работать с выражениями, которые определили машину. Это хороший компромисс для серверов с принудительным развертыванием. Точно так же вы можете выполнить удаленное развертывание без NixOps, используя nixos-rebuild --target-host или что-то пользовательское на основе nix-copy-closure.

.

Если, с другой стороны, вы хотите инициировать установку с удаленного компьютера, вам понадобятся выражения, и репозиторий git, вероятно, является наиболее практичным способом добиться этого.