【问题标题】:nix copy a nixpkgs with overlays definitionnix 复制带有覆盖定义的 nixpkgs
【发布时间】:2021-07-01 16:49:01
【问题描述】:

有没有办法以与 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 路径,我只会导入 &lt;nixpkgs&gt; 的商店版本。

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

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

【问题讨论】:

    标签: nix


    【解决方案1】:

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

    退后一步,也许最好还是发布内置的闭包或共享一个 git 存储库。 交付构建的闭包是 NixOps 所做的,并且具有可以在一个 Nix 评估过程中定义所有内容的优点,但不允许机器的用户使用定义机器的表达式。对于推送部署的服务器来说,这是一个很好的折衷方案。同样,您可以使用nixos-rebuild --target-host 或基于nix-copy-closure 自定义的东西在没有 NixOps 的情况下执行远程部署。

    另一方面,如果您想从远程计算机启动安装,则需要在那里有表达式,而 git repo 可能是实现这一目标的最实用方法。

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 1970-01-01
      • 2019-11-04
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2020-07-28
      • 2022-11-17
      相关资源
      最近更新 更多