有没有一种方法可以用一种与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。
发布于 2021-07-02 03:24:23
覆盖仅存在于Nix语言级别。它们只是函数属性集的一种模式。Nix语言的实现不提供序列化任意表达式和复制这些表达式的操作。因此,如果你想复制Nix表达式,你必须自己在文件级来做。
退一步说,要么发布构建的闭包,要么共享git repo,这可能会更好。发布构建的闭包是NixOps所做的,它的优点是所有东西都可以在一个Nix求值过程中定义,但是不允许机器的用户使用定义机器的表达式。对于推送部署的服务器来说,这是一个很好的折衷方案。类似地,您可以在没有NixOps的情况下使用nixos-rebuild --target-host或其他基于nix-copy-closure的定制工具执行远程部署。
另一方面,如果你想从远程机器启动安装,你需要有表达式,而git repo可能是实现这一目标的最实用的方法。
https://stackoverflow.com/questions/68214083
复制相似问题