haskell-stack - 将 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
解决方案
如果您真的不需要 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>
您可以使用其中一种固定技术代替。这将确保后续安装它的尝试产生相同的结果。这意味着您必须手动更新它。
推荐阅读
- c - 仅使用扩展名搜索文件名
- android - 按下后退按钮后选项卡布局中的片段为空白
- java - 为什么 JMS 的“createTextMessage”会抛出带有字符串变量参数的异常,而不是在文字字符串上?
- windows - 在 Windows 10 中创建系统还原点
- django - 在 django admin 中使用按钮调用函数
- mongodb - 在 Mongoc.jl 管道中使用 ObjectId
- c# - 如何在 MassTransit 和 Automatonymous 中配置 EF Core 持久性?
- python - 列表压缩打印 [none, none, none]
- c - 如何计算目录中存在的所有子目录?
- node.js - Typeorm 不在表中保存数据。如何在 typeorm 中进行迁移?