将NixOS中的堆栈升级到边缘Git构建出血

时间:2018-12-16 16:43:31

标签: haskell-stack nix nixos

我运行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                                                                                                                                                                              

1 个答案:

答案 0 :(得分:0)

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

这些是一些方法:

cabal2nix

pantry是与堆栈一起分发的软件包。您可能可以在其目录中运行cabal2nix并手工连接Nix表达式。

堆栈

一个简单的解决方案可能是使用您以前的stack build stackstack。尽管简单明了,但这并不是一个好的解决方案,因为它不会为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; })]; }'

重叠

您可能可以使用叠加层覆盖堆栈包的source属性。这需要一些覆盖方面的经验,并且只有在打包的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

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