Haskell 如何使用已安装的ghc,并在nix外壳内使用堆栈?

Haskell 如何使用已安装的ghc,并在nix外壳内使用堆栈?,haskell,ghc,haskell-stack,nix,nix-shell,Haskell,Ghc,Haskell Stack,Nix,Nix Shell,我已经使用stackbuild工具安装了ghc。它编译了我的项目。但是,当我在项目目录中输入nixshell并想从nixshell编译我的项目时,我看到如下错误: No compiler found, expected minor version match with ghc-8.0.2 这可以通过运行堆栈设置命令来解决。但是我担心这会再次安装ghc在我的机器上消耗更多的空间等等。有没有办法不用运行stack setup命令就将已经安装的ghc用于nix shell呢?我不确定您是如何设置项目

我已经使用
stack
build工具安装了
ghc
。它编译了我的项目。但是,当我在项目目录中输入
nixshell
并想从
nixshell
编译我的项目时,我看到如下错误:

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

这可以通过运行
堆栈设置
命令来解决。但是我担心这会再次安装
ghc
在我的机器上消耗更多的空间等等。有没有办法不用运行
stack setup
命令就将已经安装的
ghc
用于
nix shell
呢?

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

不幸的是,stack-nix集成相当落后。它不使用nix构建包,只是创建一个具有GHC和本机依赖项的环境。您必须使用stack本身来构建项目,并且由于stack将运行cabal,所以它仍然应该使用标志。stack-nix集成不会生成由stack解析的依赖项的.nix文件,因此您无法使用
nix build
构建项目,并且没有必要输入
nix shell
。为此,您必须使用类似于
stack2nix
stackage2nix
的工具

所以:使用
stack构建--nix构建
和stack应该使用nix来设置GHC和本机依赖项


当您准备好处理重要业务(如自动构建和部署)时,查看
stack2nix
stackage2nix
,使用它们将依赖项冻结到
nix
文件中,然后使用
nix build
nix copy closure
等进行构建和部署。

我对
nix
一无所知,但是,如果某个版本的GHC已经在您的计算机上下载,那么运行
堆栈设置的AFAIK将不会重新下载该版本的GHC。Stack尽可能多地在项目之间共享下载。现在Stack希望使用自己的ghc,除非通过了
--system ghc
,或者在config.yaml/Stack.yaml中指定了
system ghc:true
。因此,我建议将
system ghc:true
放入
config.yaml
@mgsloan感谢您的建议!也许,这就是解决办法。还考虑将
ghc
添加到
PATH
。堆栈是要安装在nix外壳中,还是应该存在于用户配置文件中?我的印象是,我会通过shell.nix将堆栈引入shell,然后在shell内部运行堆栈。@cmcdragokai在我的情况下,
stack
已经存在于我的用户配置文件中。