Это не работает, потому что при выводе используется ключевое слово rec
, которое не имеет понятия переопределения. Выписка:
{ stdenv, fetchurl, fetchFromGitHub, cmake, catch, python, eigen }:
stdenv.mkDerivation rec { #0
name = "pybind-${version}";
version = "2.2.4";
doCheck = true; #1
cmakeFlags = [
"-DPYBIND11_TEST=${if doCheck then "ON" else "OFF"}"
];
}
С .overrideAttrs (oldAttrs: { doCheck = false; })
вы переопределяете только атрибут doCheck
, но не cmakeFlags
, который все еще ссылается на doCheck
(#1
) из лексической области, введенной rec {}
(#0
)
Таким образом, следующее эквивалентно приведенному выше фрагменту:
{ stdenv, fetchurl, fetchFromGitHub, cmake, catch, python, eigen }:
stdenv.mkDerivation (let #0
name = "pybind-${version}";
version = "2.2.4";
doCheck = true; #1
cmakeFlags = [
"-DPYBIND11_TEST=${if doCheck then "ON" else "OFF"}"
];
in { #0
name = name;
version = version;
doCheck = doCheck; #1
cmakeFlags = cmakeFlags;
}
mkDerivation
может видеть только тот набор атрибутов, который он получает, но не может анализировать и изменять выражение, которое создает этот набор атрибутов. Это необходимый принцип проектирования языка Nix, поскольку он позволяет вам размышлять над кодом и обеспечивает лень. Семантика rec
просто не подходит для переопределения.