首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stack --nix build抱怨ghc版本不匹配

stack --nix build抱怨ghc版本不匹配
EN

Stack Overflow用户
提问于 2016-08-26 06:42:46
回答 1查看 256关注 0票数 4

当使用stack --nix build在NixOS上构建threepenny-gui时,我收到错误消息,说我有错误的ghc版本。然后我尝试了stack --nix setup,它没有运行,因为bash在NixOS上有一个意外的路径(这是意料之中的,因为堆栈文档只提到stack --nix build,而不是setup)。我遗漏了什么?

仅供参考,为了处理zlib问题,我还为每个https://github.com/commercialhaskell/stack/issues/2130添加了一个shell.nix和default.nix

编辑:我可以使用上面链接中mkkeankylej建议的方法进行构建,即在shell.nix中编辑~/.stack/config.yaml并将zlib添加到buildInputs中,但我仍然想知道是否有一种方法可以在不使用nix-shell的情况下完成?听起来stack --nix build应该和nix-shell方法一样有效。

EN

回答 1

Stack Overflow用户

发布于 2017-01-19 22:23:04

首先,threepenny-gui似乎没有提供stack.yaml,即该项目没有配置为使用stack构建。因此,我想知道为什么还要费心使用stack,因为这不会比直接使用cabal-install甚至Nix构建项目更容易。最简单、最快的方法可能是通过运行以下命令来配置构建:

代码语言:javascript
复制
$ nix-shell "<nixpkgs>" -A haskellPackages.threepenny-gui.env --run "cabal configure"

然后,您可以简单地“构建”项目并随意使用它(在nix-shell内部或外部);Nix提供了编译器和所有必要的构建依赖项。

如果你不想这样,那么你可以使用普通的cabal-install方法:

代码语言:javascript
复制
$ cabal sandbox init
$ cabal install --only-dependencies
$ cabal configure
$ cabal build

该构建可能需要系统库,如libz,因此您必须确保这些库可用。要做到这一点,有一百万种不同的方法,但最干净的IMHO如下:

代码语言:javascript
复制
$ zlibinc=$(nix-build --no-out-link "<nixpkgs>" -A zlib.dev)
$ zliblib=$(nix-build --no-out-link "<nixpkgs>" -A zlib.out)
$ cabal install --only-dependencies --extra-include-dirs=$zlibinc --extra-lib-dirs=$zliblib

最后但并非最不重要的一点是,我不清楚为什么stack build --nix命令不会成功,因为该命令将使用Nix自动安装正确版本的GHC。因此,如果这不起作用,那么我最好的猜测是您使用的是旧版本的stack,其中该功能不能正常工作。我尝试过使用Nix提供的stack二进制文件stack 1.3.2构建该版本,它可以很好地编译当前threepenny-gui的git签出:

代码语言:javascript
复制
$ git clone git://github.com/HeinrichApfelmus/threepenny-gui.git
Cloning into 'threepenny-gui'...
remote: Counting objects: 4102, done.        
remote: Total 4102 (delta 0), reused 0 (delta 0), pack-reused 4101        
Receiving objects: 100% (4102/4102), 1.88 MiB | 581.00 KiB/s, done.
Resolving deltas: 100% (2290/2290), done.

$ cd threepenny-gui
$ stack init
Looking for .cabal or package.yaml files to use to init the project.
Using cabal packages:
- threepenny-gui.cabal

Selecting the best among 9 snapshots...

* Partially matches lts-7.16
    websockets-snap not found
        - threepenny-gui requires >=0.8 && <0.11
    Using package flags:
        - threepenny-gui: buildexamples = False, network-uri = True, rebug = False

* Matches nightly-2017-01-17

Selected resolver: nightly-2017-01-17
Initialising configuration using resolver: nightly-2017-01-17
Total number of user packages considered: 1
Writing configuration to file: stack.yaml
All done.
$ stack build --nix --nix-packages zlib
threepenny-gui-0.7.1.0: configure (lib)
Configuring threepenny-gui-0.7.1.0...
threepenny-gui-0.7.1.0: build (lib)
Preprocessing library threepenny-gui-0.7.1.0...
[...]
Registering threepenny-gui-0.7.1.0...

这不需要对nix-shell进行任何特殊编辑的配置文件,也不需要对stack进行特殊定制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39155853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档