【问题标题】:How to use already installed ghc with stack inside nix-shell?如何在 nix-shell 中使用已安装的 ghc 和堆栈?
【发布时间】:2017-09-13 09:42:26
【问题描述】:

我已经使用stack 构建工具安装了ghc。它编译我的项目。但是当我在项目目录中输入nix-shell 并想从nix-shell 编译我的项目时,我看到这样的错误:

No compiler found, expected minor version match with ghc-8.0.2

这可以通过运行stack setup 命令来解决。但我担心这会再次安装ghc,从而在我的机器上消耗更多空间等等。有没有办法在不运行stack setup 命令的情况下将已安装的ghc 用于nix-shell

【问题讨论】:

  • 我对@9​​87654331@ 一无所知,但如果运行stack setup 的AFAIK 版本已经下载到您计算机的某个位置,则该版本不会重新下载该版本。 Stack 尽可能地尝试在项目之间共享下载。
  • 现在栈想要使用自己的 ghc,除非通过 --system-ghc 或在 config.yaml / stack.yaml 中指定 system-ghc: true。所以,我建议将system-ghc: true 放入config.yaml
  • @mgsloan 感谢您的建议!可能,这就是解决方案。还考虑将ghc 添加到PATH
  • 堆栈是要安装在 nix-shell 中,还是应该存在于用户配置文件中?我的印象是我会通过 shell.nix 在 shell 中引入堆栈,然后在 shell 中运行堆栈。
  • @CMCDragonkai 在我的情况下 stack 已经存在于我的用户配置文件中。

标签: haskell ghc haskell-stack nix nix-shell


【解决方案1】:

我不确定您是如何设置项目的,但可能最简单(但有限)的方法是使用堆栈的 nix integration,它将使用来自 nix 的 GHC 和本机依赖项。

不幸的是,堆栈 nix 集成相当落后。它不使用 nix 来构建你的包,只是为了创建一个具有 GHC 和本机依赖项的环境。您必须使用 stack 本身来构建项目,并且由于 stack 将运行 cabal,它仍然应该与 flag 一起使用。堆栈 nix 集成不会生成 .nix 文件,其中依赖项由堆栈解析,因此您无法使用 nix-build 构建项目,并且输入 nix-shell 毫无意义。为此,您必须使用 stack2nixstackage2nix 之类的工具。

所以:使用stack --nix build 构建并且堆栈应该使用 nix 来设置 GHC 和本机依赖项。

当您准备好进行严肃的业务(如自动构建和部署)时,请查看 stack2nixstackage2nix,使用它们将依赖项冻结到 nix 文件中,然后使用 nix-build 构建和部署, nix-copy-closure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2019-04-29
    • 2011-02-25
    • 2012-05-26
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多