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
已经存在于我的用户配置文件中。