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

问题描述 投票:2回答:1

我正在使用精彩的Haskell库Miso,它推荐使用Nix。 README引导我们完成一个可以用nix-build构建的简单项目。 Miso的文档暗示我可以做到:

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

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

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

haskell cabal cabal-install nix
1个回答
3
投票

一般情况下,您不能保证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.

© www.soinside.com 2019 - 2024. All rights reserved.