【问题标题】:Can I replicate what nix-build does with nix-shell and cabal build?我可以复制 nix-build 对 nix-shell 和 cabal build 所做的事情吗?
【发布时间】:2018-09-09 22:13:48
【问题描述】:
我正在使用出色的 Haskell 库 Miso,它建议使用 Nix。自述文件将引导我们完成一个可以使用nix-build 构建的简单项目。 Miso 的文档提示我可以这样做:
nix-shell -A env
cabal configure --ghcjs
cabal build
它也会构建项目,尽管它会将结果放在不同的位置。
nix-shell 中的nix-build 和cabal build 是否保证产生相同的输出?更一般地说,给定.nix 表达式,我将如何锻炼复制它的行为需要哪些步骤(例如 cabal 配置)?
【问题讨论】:
标签:
haskell
cabal
cabal-install
nix
【解决方案1】:
一般来说,您不能保证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.