4

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

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

编辑:能够使用上述链接中 mkkeankylej 建议的方法进行构建,即在 shell.nix 中编辑~/.stack/config.yaml并添加 zlibbuildInputs但我仍然想知道是否有办法做到这一点而无需回退到 nix-壳?听起来stack --nix build只要 nix-shell 方法可以工作,它就应该工作。

4

1 回答 1

0

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

$ nix-shell "<nixpkgs>" -A haskellPackages.threepenny-gui.env --run "cabal configure"

之后,您可以简单地“阴谋构建”项目并根据需要使用它(在 a 内部或外部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该功能无法正常工作的旧版本。stack我已经尝试使用Nix 提供的二进制文件 stack 1.3.2 进行构建,它可以编译当前的 git checkoutthreepenny-gui就好了:

$ 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.

于 2017-01-19T14:23:03.923 回答