我试图用旧的 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
如果您只是使用
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 :附带说明一下,您可能希望将 nixpkgs 版本固定在您的 haskell 项目中,以便您知道即使升级系统的其余部分也可以可靠地重建它们。有关如何执行此操作的更多信息,请参阅https://github.com/Gabriel439/haskell-nix/tree/master/project0#pinning-nixpkgs或https://nixos.wiki/wiki/FAQ/Pinning_Nixpkgs 。