如何確定 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
如果您只是使用
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 。