我运行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
答案 0 :(得分:0)
如果您真的不需要git版本,请考虑水平线下方最后的选项。
这些是一些方法:
pantry
是与堆栈一起分发的软件包。您可能可以在其目录中运行cabal2nix并手工连接Nix表达式。
一个简单的解决方案可能是使用您以前的stack build stack
来stack
。尽管简单明了,但这并不是一个好的解决方案,因为它不会为stack
可执行文件的依赖项创建垃圾回收根。
这是更具实验性,更自动化的方法,但仍需要一点干预。
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版本之间堆栈的依赖性要求没有变化的情况下才能很好地工作。
尽管不是您原始问题的确切答案,但它是获取最新版本栈的更简单且充分的解决方案。我将在下面讨论从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
创建文件stack-from-unstable.nix
(import <nixos-unstable> {}).stack
然后
nix-env -i -f `stack-from-unstable.nix`
您可以使用pinning techniques之一来代替import <nixos-unstable>
。这将确保后续尝试安装它会产生相同的结果。这意味着您必须手动更新它。