Nixos

調試為什麼 nix 在 nixpkgs 二進制記憶體中不必要地建構包?

  • August 8, 2020

我在 IRC 頻道中問過這個問題,但我想我會在這裡記錄它以供我自己和其他人參考。


我有一個 shell.nix 文件需要很長時間才能建構,特別是它似乎正在建構一個HUnit包。

我的 shell.nix 文件如下所示:

{
sources ? import ./nix/sources.nix
, compiler ? "ghc865" } :
let
 niv = import sources.nixpkgs {
   overlays = [
     (_ : _ : { niv = import sources.niv {}; })
   ] ;
   config = {};
 };
 pkgs = niv.pkgs;
 myHaskellPackages = pkgs.haskell.packages.${compiler}.override {
 };
in
myHaskellPackages.callCabal2nix "moscoviumorange" (./.) {}

並且源被固定到(使用 niv):

{
   "niv": {
       "branch": "master",
       "description": "Easy dependency management for Nix projects",
       "homepage": "https://github.com/nmattia/niv",
       "owner": "nmattia",
       "repo": "niv",
       "rev": "88d6f20882b0422470acbcbf2d1b5f07e1d436f0",
       "sha256": "0wkvz4drnglmmdrz8q1i1yr2fqizpf96k1wq2rlhd8l8x1522izq",
       "type": "tarball",
       "url": "https://github.com/nmattia/niv/archive/88d6f20882b0422470acbcbf2d1b5f07e1d436f0.tar.gz",
       "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
   },
   "nixpkgs": {
       "branch": "nixos-19.03",
       "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
       "homepage": "https://github.com/NixOS/nixpkgs",
       "owner": "NixOS",
       "repo": "nixpkgs-channels",
       "rev": "775fb69ed73e7cf6b7d3dd9853a60f40e8efc340",
       "sha256": "1w068b0ydw4c26mcjiwlzdfqcdk3rrwmfx4hxzgfhfwcz2nmh3if",
       "type": "tarball",
       "url": "https://github.com/NixOS/nixpkgs-channels/archive/775fb69ed73e7cf6b7d3dd9853a60f40e8efc340.tar.gz",
       "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
   }
}

當我假設它們應該在 nixpkg 的二進制記憶體中時,為什麼 nix 會建構一堆包?

例如 nix-shell 的輸出包括:

building '/nix/store/7011izw8f2xyvhqadrhnmapddyz61f29-HUnit-1.6.0.0.drv'...

我們可以在 Hydra (for 19.03) 中搜尋 HUnit 包:

https://hydra.nixos.org/eval/1552169?filter=HUnit&compare=1551557&full=#tabs-still-fail

根據上面HUnit的建構,會在二進制記憶體中。


我們確定正在建構的派生的儲存路徑:

nix-store --query --binding out /nix/store/7011izw8f2xyvhqadrhnmapddyz61f29-HUnit-1.6.0.0.drv
/nix/store/ryr2qdms3n0qbj8d3l9pvs7ajz4dzav4-HUnit-1.6.0.0

我們可以將以下內容與 hydra 進行比較:https ://hydra.nixos.org/build/103222205#tabs-details

curl https://cache.nixos.org/ryr2qdms3n0qbj8d3l9pvs7ajz4dzav4.narinfo
404

404 表示路徑不在二進制記憶體中。


答案原來是我指ghc的是ghc865當 hydra 可能ghc864預設建構時(對於 19.03)。

以上答案來自cleverIRC#nixos頻道,謝謝!

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