我可以复制 nix-build 对 nix-shell 和 cabal build 的作用吗?
Can I replicate what nix-build does with nix-shell and cabal build?
我正在使用出色的 Haskell 库 Miso,它推荐使用 Nix。自述文件引导我们完成一个可以使用 nix-build
构建的简单项目。 Miso 的文档提示我可以这样做:
nix-shell -A env
cabal configure --ghcjs
cabal build
它也构建了项目,尽管它把结果放在不同的地方。
nix-shell 中的 nix-build
和 cabal 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 和 plain ghc
,运行ning 没有沙箱的结果是它可以访问您的用户包数据库。在 nix-shell
中使用这些工具时需要注意这一点;
我正在使用出色的 Haskell 库 Miso,它推荐使用 Nix。自述文件引导我们完成一个可以使用 nix-build
构建的简单项目。 Miso 的文档提示我可以这样做:
nix-shell -A env
cabal configure --ghcjs
cabal build
它也构建了项目,尽管它把结果放在不同的地方。
nix-shell 中的 nix-build
和 cabal 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 和 plain ghc
,运行ning 没有沙箱的结果是它可以访问您的用户包数据库。在 nix-shell
中使用这些工具时需要注意这一点;