2017-09-13 58 views
2

我已经使用stack构建工具安装了ghc。它编译我的项目。但是,当我进入nix-shell项目目录中,并希望从nix-shell编译项目中,我看到的错误是这样的:如何使用已安装的ghc与nix-shell中的堆栈?

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

这可以通过运行stack setup命令是固定的。但我担心这会再次安装ghc在我的机器上耗费更多空间等等。有没有办法使用已安装的ghc for nix-shell而不运行stack setup命令?

+0

我对'nix'一无所知,但是运行'stack setup'的AFAIK不会重新下载GHC的一个版本,如果这个版本已经被下载到你的计算机的某个地方的话。 Stack尽可能地尝试在项目之间共享下载。 – Alec

+0

现在,堆栈想要使用自己的ghc,除非在config.yaml/stack.yaml中指定了'--system-ghc'或'system-ghc:true'。所以,我建议在'config.yaml'中放入'system-ghc:true'。 – mgsloan

+0

@mgsloan感谢您的咨询!可能这是解决方案。同时考虑在'PATH'中添加'ghc'。 – Shersh

回答

1

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

不幸的是,堆栈nix集成是相当倒退。它不使用nix来构建你的包,只是为了创建一个GHC和本地依赖的环境。您必须使用堆栈本身来构建项目,并且由于堆栈将运行cabal,所以它仍然可以使用该标志。堆栈nix集成不会生成一个.nix文件,依赖关系由堆栈解析,因此您无法使用nix-build来构建项目,并且在输入nix-shell时没有意义。你将不得不使用像stack2nixstackage2nix这样的工具。

所以:用stack --nix build构建,栈应该使用nix来设置GHC和本地依赖。

当你准备好严重的企业(如自动构建和部署),看看stack2nixstackage2nix,使用它们的依赖冻结成nix文件,然后构建和部署nix-buildnix-copy-closure