Аргументы при вызове выражения nix

В выражении nix для GNU Hello в руководстве, которое является следующим:

{ stdenv, fetchurl, perl }: 1

stdenv.mkDerivation { 2
  name = "hello-2.1.1"; 3
  builder = ./builder.sh; 4
  src = fetchurl { 5
    url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz;
    sha256 = "1md7jsfd8pa45z73bz1kszpp01yw6x5ljkjk2hx7wl800any6465";
  };
  inherit perl; 6
}

Откуда ты это знаешь stdenv, fetchurl а также perl находятся в наборе, который передается в качестве аргумента для этого выражения nix?

Также в этом выпуске 0.nix от Gabriel439/haskell-nix что значит callPackage делать? И как мы узнаем, что callPackage существуют в haskellPackages атрибут пути?

Еще 1 из вышеперечисленного release0.nix, я догадываюсь callPackage работает так же, как import но с текущим набором, также передаваемым в качестве аргумента, это правда? Если так, я могу изменить выражение с этим:

let
  pkgs = import <nixpkgs> {};
  haskellPkgs = pkgs.haskellPackages;
  myPackages = import ./default.nix;
in
  myPackages haskellPkgs

Извините, это много вопросов!

1 ответ

Решение

На ваш вопрос о callPackageЯ думаю, что у Луки Бруно (летального человека) есть отличное объяснение в его серии "Nix Pill". Относительно того, почему мы знаем, что это там, callPackage потому что кто-то так написал. Его использование задокументировано в документации Nixpkgs.

Чтобы ответить на ваш последний вопрос: да, вы можете заменить его предложенным выражением, но вам нужно внести небольшое изменение в default.nix, потому что функция должна игнорировать все атрибуты, в которых она не нуждается. haskellPkgs, Вы можете сделать это, добавив ... в список аргументов, как это:

{ mkDerivation, base, stdenv, ... }:
Другие вопросы по тегам