나는 이전 nixpkgs 채널/분기( )를 사용하여 18.03
이전 Haskell 프로젝트를 빌드하려고 합니다.
처음 빌드하려고 할 때 컴파일러 버전을 ghc843
...로 지정하지만 빌드할 때 캐시에서 나올 것으로 예상하면 모든 외부 라이브러리를 빌드하는 것 같습니다.
다행히도 이전에 이런 문제가 발생한 적이 있다는 것을 기억했습니다.디버깅 nixpkgs 바이너리 캐시에 있어야 할 불필요한 패키지를 nix가 빌드하는 이유는 무엇입니까?
문제는 기본적으로 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.03
.https://github.com/NixOS/nixpkgs/blob/18.03/pkgs/top-level/all-packages.nix#L6216:
haskellPackages = haskell.packages.ghc822.override {
그건 그렇고, 하스켈 프로젝트에 nixpkgs 버전을 고정하면 시스템의 나머지 부분을 업그레이드하더라도 안정적으로 다시 빌드할 수 있다는 것을 알 수 있습니다. 바라보다https://github.com/Gabriel439/haskell-nix/tree/master/project0#pinning-nixpkgs또는https://nixos.wiki/wiki/FAQ/Pinning_Nixpkgs이를 수행하는 방법에 대한 추가 정보.