是否有一种方法可以以与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>
的存储版本。
pkgs3.aardvark
也存在,但这不是我想要的解决方案。
我的预期用途是使用覆盖执行pkgs
的nix copy
。我可以复制pkgs.path
定义,但不能复制覆盖,因为它是lambda的列表,而不是路径。我希望有一个非常简单的解决方案,比如有一个像pkgs.drv
或pkgs.out
这样的属性,可以用例如import pkgs.out
导入,并传递被覆盖的包集,而不是pkgs.path
。
套印格式仅存在于Nix语言级别。它们只是函数属性集的一种模式。Nix语言的实现不提供序列化任意表达式和复制这些表达式的操作。因此,如果你想复制Nix表达式,你必须在文件级别自己完成。
退一步说,也许最好是发货关闭或共享git回购。运输构建的闭包是NixOps所做的,它的优点是所有东西都可以在一个Nix评估过程中定义,但不允许机器用户使用定义机器的表达式。对于推送部署的服务器来说,这是一个很好的折衷方案。类似地,您可以使用nixos-rebuild --target-host
或基于nix-copy-closure
自定义的东西在没有NixOps的情况下执行远程部署。
另一方面,如果你想从远程机器启动安装,你需要有表达式,而git-reo可能是实现这一点的最实用的方法。