能否用nix-shell和cabal build来复制nix-build的功能?

4

我正在使用优秀的Haskell库Miso,该库建议使用Nix。README文件引导我们完成一个简单的项目,可以使用nix-build构建。Miso的文档暗示我可以执行以下操作:

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

虽然将结果放在不同的位置,但nix-build也构建了项目。

nix-shell中的nix-buildcabal build是否保证产生相同的输出? 更一般地,给定一个.nix表达式,如何找出需要哪些步骤(如cabal configure)才能复制它的行为?

1个回答

6
一般来说,无法保证nix-build的输出和在nix-shell中执行相同步骤的结果相等。造成差异的一些原因包括:
  • nix-build可以在沙盒环境中运行构建过程,而nix-shell则不会。
  • nix-shell可以在不带--pure标志的情况下调用,这样会设置更多的环境变量(例如,使您可以使用GUI应用程序)。
  • 尽管nix-shell设置了$out环境变量,但它是不可写的。
  • nix-shell中的进程以您的用户身份运行,而启用守护程序的nix-build通常会将其作为nixbld<n>运行,即使禁用了沙盒功能也是如此。

而且,可能还有其他我现在没有考虑到的原因。

特别地,在使用cabal-install和纯ghc时,无沙盒运行的后果是它可以访问您的用户软件包数据库。因此,在nix-shell中使用这些工具需要格外小心;请参阅这个答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接