首页 > 解决方案 > 将 NixOS 中的堆栈升级到 Bleeding Edge Git 构建

问题描述

我运行 NixOS,因此在更新时遇到了问题stack,因为nixpkgs我的稳定分支总是落后。从官方文档中我们可以构建以下函数来升级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-stacknixnixos

解决方案


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

这些是一些方法:

阴谋集团

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

一个简单的解决方案可能是stack build stack使用您以前的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 不稳定

尽管不完全是您原始问题的答案,但对于获取最新版本的堆栈来说,这是更容易且足够的解决方案。我将在下面讨论从 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-env

用于nix-env创建文件stack-from-unstable.nix

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

接着

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

固定nixpkgs

import <nixos-unstable>您可以使用其中一种固定技术代替。这将确保后续安装它的尝试产生相同的结果。这意味着您必须手动更新它。


推荐阅读