nix 复制一个带有覆盖定义的 nixpkgs

nix copy a nixpkgs with overlays definition

有没有办法以与 nix copy 兼容的方式恢复由带有覆盖层的 nixpkgs 创建的包集?

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>.[=24 的商店版本=]

pkgs3.aardvark 也存在,但这不是我正在寻找的解决方案。

我的预期用途是使用叠加层执行 pkgsnix copy。我可以复制 pkgs.path 定义,但不能复制叠加层,因为它是一个 lambda 列表,而不是路径。我希望有一个非常简单的解决方案,比如 pkgs.path 有一个 pkgs.drvpkgs.out 之类的属性可以导入,例如import pkgs.out 并提供覆盖的包集。

覆盖仅存在于 Nix 语言级别。它们只是函数属性集的一种模式。 Nix 语言的实现不提供序列化任意表达式和复制它们的操作。所以如果你想复制 Nix 表达式,你必须在文件级别自己做。

退后一步,也许最好是发布内置闭包或共享 git 存储库。 NixOps 所做的就是交付构建的闭包,它的优点是可以在一个 Nix 评估过程中定义所有内容,但不允许机器的用户使用定义机器的表达式。对于推送部署的服务器来说,这是一个很好的权衡。同样,您可以使用 nixos-rebuild --target-host 或基于 nix-copy-closure.

的自定义内容在没有 NixOps 的情况下执行远程部署

另一方面,如果您想从远程计算机启动安装,则需要在其中包含表达式,git 存储库可能是实现该目的的最实用方法。