关于调用 nix 表达式的参数

Arguments on invoking a nix expression

手册中GNU Hello的nix表达式,就是这个:

{ 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
}

您怎么知道 stdenvfetchurlperl 在作为该 nix 表达式的参数传递的集合中?

同样在 Gabriel439/haskell-nixrelease0.nix 中,callPackage 是做什么的?而我们如何知道 callPackage 存在于 haskellPackages 属性路径中呢?

上面还有1个release0.nix。我猜 callPackage 就像 import 一样工作,但是当前集也作为参数传入,这是真的吗?如果是这样,我可以用这个改变表达式吗:

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

抱歉问题太多了!

关于你关于 callPackage 的问题,我认为 Luca Bruno (lethalman) 有一个 great explanation in his Nix Pill series. As to why we know it's there, callPackage is there because someone wrote it that way. Its usage is documented in the Nixpkgs documentation

回答你的最后一个问题:是的,你可以用你建议的表达式替换它,但是你需要在 default.nix 中做一点改变,因为函数需要忽略它不需要的所有属性来自 haskellPkgs。您可以通过将 ... 添加到参数列表来做到这一点,如下所示:

{ mkDerivation, base, stdenv, ... }: