Я пытался создать старый проект Haskell со старым каналом/ветвью nixpkgs (18.03).

При первой попытке его сборки я указал версию компилятора как ghc843... Однако при сборке казалось, что он собирает ВСЕ внешние библиотеки, хотя я ожидал, что они будут поступать из кеша.

К счастью, я вспомнил, что уже сталкивался с этой проблемой ранее: -be-in-nixpk">Отладка, почему 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, который, кажется, используется по умолчанию (или, по крайней мере, в Гидре были кэшированные активы).


Я понял, как составить список доступных версий компилятора ghc, используя nix repl, например:

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
4
Chris Stryczynski 29 Фев 2020 в 03:08

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 в своих проектах haskell, чтобы знать, что их можно надежно пересобрать даже при обновлении остальной части вашей системы. См. https://github.com/Gabriel439/haskell-nix. /tree/master/project0#pinning-nixpkgs или https://nixos.wiki/wiki /FAQ/Pinning_Nixpkgs для получения дополнительной информации о том, как это сделать.

2
Hjulle 28 Апр 2020 в 22:51