我试图用旧的 nixpkgs 通道/分支(18.03
)构建一个旧的 Haskell 项目。
在我第一次尝试构建它时,我将编译器版本指定为ghc843
...但是在构建时 - 当我期望它来自缓存时,它似乎正在构建所有外部库。
幸运的是,我记得我之前遇到过这个问题:调试为什么 nix 在应该位于 nixpkgs 二进制缓存中的情况下构建了不必要的包?
问题基本上是我使用的是 ghc 的“非默认”版本(Hydra 不会构建/缓存)。
所以现在我的问题是,我怎样才能找到“默认”编译器版本 - 或者 Hydra 构建/缓存的版本?
{
nixpkgs ? import <nixpkgs> {}
, sources ? import ./nix/sources.nix
, compiler ? "ghc843" } :
let
niv = import sources.nixpkgs {
overlays = [
(_ : _ : { niv = import sources.niv {}; })
] ;
config = {};
};
pkgs = niv.pkgs;
myHaskellPackages = pkgs.haskell.packages.${compiler}.override {
};
in
(myHaskellPackages.callCabal2nix "abc" (./.) {})
偶然我尝试了ghc823
这似乎是默认的(或者至少在 Hydra 中缓存了资产)。
我想出了如何使用 nix repl 列出可用的 ghc 编译器版本,如下所示:
nix-repl> yolo = (import nix/sources.nix {})
nix-repl> yolo.blablaTestTabCompletion
nix-repl> yolo2 = (import yolo.nixpkgs {})
nix-repl> yolo2.haskell.packages.
yolo2.haskell.packages.ghc7103 yolo2.haskell.packages.ghc843
yolo2.haskell.packages.ghc7103Binary yolo2.haskell.packages.ghcHEAD
yolo2.haskell.packages.ghc802 yolo2.haskell.packages.ghcjs
yolo2.haskell.packages.ghc821Binary yolo2.haskell.packages.ghcjsHEAD
yolo2.haskell.packages.ghc822 yolo2.haskell.packages.integer-simple
yolo2.haskell.packages.ghc841
答案1
如果您只是使用haskellPackages
而不是,haskell.packages.ghc<version>
您将始终获得默认版本。
您还可以检查该行haskellPackages = dontRecurseIntoAttrs haskell.packages.ghc883
(~/.nix-defexpr/channels/nixpkgs/pkgs/top-level/all-packages.nix
或您正在使用的 nixpkgs 通道的任何路径)以查看哪个是您通道的默认 ghc 版本。
这是该行的链接18.03
:https://github.com/NixOS/nixpkgs/blob/18.03/pkgs/top-level/all-packages.nix#L6216:
haskellPackages = haskell.packages.ghc822.override {
顺便说一句,您可能希望将 nixpkgs 版本固定在您的 haskell 项目中,这样您就知道即使您升级系统的其余部分,也可以可靠地重建它们。看https://github.com/Gabriel439/haskell-nix/tree/master/project0#pinning-nixpkgs或者https://nixos.wiki/wiki/FAQ/Pinning_Nixpkgs有关如何执行此操作的更多信息。