我可以复制nix-build与nix-shell和cabal构建的内容吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以复制nix-build与nix-shell和cabal构建的内容吗?相关的知识,希望对你有一定的参考价值。

我正在使用精彩的Haskell库Miso,它推荐使用Nix。 README引导我们完成一个可以用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和普通的ghc,没有沙箱运行的结果是它可以访问你的用户包db。这需要在nix-shell中使用这些工具时要小心; see this answer.

以上是关于我可以复制nix-build与nix-shell和cabal构建的内容吗?的主要内容,如果未能解决你的问题,请参考以下文章

NixOS:设置 nix-shell 的选项

如何使用 cabal 在 ghcid 中运行测试套件?

Recyclerview:如何将一些帖子与图像和没有图像混合? [复制]

数据映射器与数据访问对象。区别。哪个更好? [复制]

Robocopy 可以与 refs 文件系统配合使用,以提高数据复制和同步的效率和可靠性

Facebook 通知网络套接字与拉动? [复制]