当用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从上面的链接建议的方法构建,即编辑~/.stack/config.yaml
并在shell.nix中将zlib添加到buildInputs
但是我仍然想知道是否有一种方法可以做到不退回到nix-shell?听起来stack --nix build
只要nix-shell方法就可以工作。
答案 0 :(得分:0)
首先,threepenny-gui
似乎不提供stack.yaml
,即项目未配置为使用stack
构建。因此,我想知道为什么你甚至不愿意使用stack
因为这不比直接用cabal-install
甚至Nix
构建项目容易。最简单,最快捷的方法可能是通过运行来配置构建:
$ nix-shell "<nixpkgs>" -A haskellPackages.threepenny-gui.env --run "cabal configure"
之后,你可以简单地建立&#34; cabal build&#34;项目并随意使用(nix-shell
内部或外部);编译器和所有必要的构建依赖项由Nix提供。
如果您不想要,那么您可以使用正常的cabal-install
方法:
$ cabal sandbox init
$ cabal install --only-dependencies
$ cabal configure
$ cabal build
该构建可能需要系统库,如libz
,因此您必须确保这些库可用。有一百万种不同的方法来实现这一目标,但最干净的恕我直言如下:
$ 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
二进制文件进行构建,堆栈为1.3.2,它可以编译threepenny-gui
的当前git checkout:
$ 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
的特殊自定义。