Nixos

如何確定 Hydra 中為 Nix nixpkgs 記憶體的軟體包版本?

  • April 28, 2020

我試圖用舊的 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.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-nixpkgshttps://nixos.wiki/wiki/FAQ/Pinning_Nixpkgs 。

引用自:https://unix.stackexchange.com/questions/570310