如何确定 Hydra 中为 Nix nixpkgs 缓存的软件包版本?

如何确定 Hydra 中为 Nix nixpkgs 缓存的软件包版本?

我试图用旧的 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.03https://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有关如何执行此操作的更多信息。

相关内容