【问题标题】:Upgrading Stack in NixOS to Bleeding Edge Git Build将 NixOS 中的堆栈升级到 Bleeding Edge Git 构建
【发布时间】:2019-05-17 04:13:50
【问题描述】:

我运行 NixOS,因此无法更新 stack,因为 nixpkgs 在我的稳定分支上总是落后。从the official docs我们可以构建以下函数来升级stack

upgradeLocalStackInNixOS() {
  git clone https://github.com/commercialhaskell/stack.git stack
  cd stack
  cabal2nix --shell ./. --no-check --no-haddock > shell.nix
  nix-env -i -f shell.nix
}

问题:这会产生以下错误:

Cloning into 'stack'...
remote: Enumerating objects: 44411, done.
remote: Total 44411 (delta 0), reused 0 (delta 0), pack-reused 44411
Receiving objects: 100% (44411/44411), 14.82 MiB | 1.05 MiB/s, done.
Resolving deltas: 100% (31314/31314), done.
*** found package.yaml. Using hpack...
error: 'f' at /home/george/.dotfiles/nixos/stack/shell.nix:7:7 called without required argument 'pantry', at /nix/store/i9f158cv3dfkn30pb4bssba575h7f409-nixos-18.09.1446.db561c90ef3/nixos/pkgs/development/haskel
l-modules/make-package-set.nix:87:27                                                                                                                                                                              

【问题讨论】:

    标签: haskell-stack nix nixos


    【解决方案1】:

    如果您真的不需要 git 版本,请考虑水平线下方末尾的最后一个选项。

    这些是一些方法:

    cabal2nix

    pantry 是一个随栈分发的包。您可能可以在其目录中运行 cabal2nix 并手动连接 Nix 表达式。

    堆栈

    一个简单的解决方案可能是使用您以前的stackstack build stack。虽然简单,但它不是一个好的解决方案,因为它不会为您的 stack 可执行文件的依赖项创建垃圾收集根。

    stack2nix

    这更具实验性,更自动化,但仍需要一点干预。

    stack2nix --test --platform x86_64-linux --hackage-snapshot 2018-12-16T10:00:00Z . > stack-custom-snapshot.nix
    

    您现在有一个类似于pkgs.haskell.packages.* 的生成包集,包括stack.yaml 中的包。您将不得不禁用堆栈和储藏室的测试。这可以通过覆盖(另一个​​主题)或通过将doCheck = false; 添加到stack-custom-snapshot.nix 中的两个包的参数来完成。也需要一点帮助才能找到libyaml

    nix-env -i -f stack-custom-snapshot.nix -A stack --arg pkgs 'import <nixpkgs> { overlays = [(self: super: { yaml = super.libyaml; })]; }'
    

    叠加

    您可以使用覆盖覆盖堆栈包的源属性。这需要一些覆盖经验,并且只有在打包的 Stack 和 git 版本之间的堆栈依赖要求没有改变时才能正常工作。


    Nixpkgs 不稳定

    虽然不完全是您原始问题的答案,但对于获取 a 最新版本的堆栈来说,这是更简单且足够的解决方案。我将在下面讨论从 git 安装的选项。

    您可以在您的 NixOS 配置或用户配置文件中包含来自任何 Nixpkgs 版本的软件包。

    按渠道

    先添加频道

    nix-channel --add https://nixos.org/channels/nixos-unstable nixos-unstable
    nix-channel --update     # actually fetch your channels
    

    在您的 NixOS 配置中

    environment.systemPackages =
      let
        unstable = import <nixos-unstable> {};
      in
        [ pkgs.figlet unstable.stack pkgs.hello ];
    

    nix 环境

    nix-env创建一个文件stack-from-unstable.nix

    (import <nixos-unstable> {}).stack
    

    然后

    nix-env -i -f `stack-from-unstable.nix`
    

    固定的 nixpkgs

    您可以使用pinning techniques 之一来代替import &lt;nixos-unstable&gt;。这将确保后续安装它的尝试产生相同的结果。这意味着您必须手动更新它。

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 2018-05-08
      • 2012-04-02
      • 2020-08-07
      • 2019-03-03
      • 2017-05-04
      • 1970-01-01
      • 2020-09-15
      • 2019-01-12
      相关资源
      最近更新 更多