【问题标题】:stack --nix build complains about ghc version mismatchstack --nix build 抱怨 ghc 版本不匹配
【发布时间】:2017-01-02 12:14:18
【问题描述】:

在 NixOS 上使用 stack --nix build 构建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 并将 zlib 添加到 shell.nix 中的 buildInputs 但我仍然想知道是否有办法它不会退回到 nix-shell 吗?听起来stack --nix build 应该只要 nix-shell 方法就可以工作。

【问题讨论】:

    标签: haskell haskell-stack nix


    【解决方案1】:

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

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

    之后,您可以简单地“阴谋构建”项目并随意使用它(在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 进行特殊定制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2011-02-22
      • 2021-06-20
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多