我正在使用出色的Haskell库Miso,该库建议使用Nix。自述文件将引导我们完成一个可以使用nix-build
构建的简单项目。味iso的文档提示我可以做:
nix-shell -A env
cabal configure --ghcjs
cabal build
尽管结果将放置在其他位置,它也可以构建项目。
nix-shell中的nix-build
和cabal build
是否保证产生相同的输出?更一般而言,给定一个.nix
表达式,我将如何锻炼才能复制其行为而需要执行哪些步骤(例如cabal configure)?
答案 0 :(得分: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.