我可以复制 nix-build 对 nix-shell 和 cabal build 的作用吗?

Can I replicate what nix-build does with nix-shell and cabal build?

我正在使用出色的 Haskell 库 Miso,它推荐使用 Nix。自述文件引导我们完成一个可以使用 nix-build 构建的简单项目。 Miso 的文档提示我可以这样做:

nix-shell -A env
cabal configure --ghcjs
cabal build

它也构建了项目,尽管它把结果放在不同的地方。

nix-shell 中的 nix-buildcabal build 是否保证产生相同的输出?更一般地说,给定一个 .nix 表达式,我将如何锻炼复制它的行为需要哪些步骤(例如 cabal 配置)?

一般来说,不能保证 nix-build 的输出和 nix-shell 中的相同步骤是等价的。一些差异的原因:

  • nix-build 可以 运行 在沙箱中构建,而 nix-shell 不会。
  • nix-shell 可以在没有 --pure 标志的情况下调用,以便设置更多的环境变量(例如,这使您可以使用 GUI 应用程序)
  • 虽然nix-shell设置了$out环境变量,但不可写
  • nix-shell 运行 中的一个进程作为您的用户,而 nix-build 启用守护进程通常 运行 它作为 nixbld<n>,即使沙盒已禁用

可能还有更多我现在没有想到的。

特别是对于 cabal-install 和 plain ghc,运行ning 没有沙箱的结果是它可以访问您的用户包数据库。在 nix-shell 中使用这些工具时需要注意这一点;