Оверрайды
Nix позволяет ползователю вносить изменения в процесс сборки пакетов с помощью функции override, выдающей на выходе новый derivation.
Так, например, можно добавить пакет rime-data-flypy в rimeDataPkgs пакета fcitx5-rime. На выходе получаем derivation, в котором rimeDataPkgs изменен, в то время как остальные параметры - нет:
pkgs.fcitx5-rime.override { rimeDataPkgs = [ ./rime-data-flypy ]; }Есть несколько способов определить, какие параметры конкретных пакетов можно оверрайдить:
- Посмотреть Nix expression пакета в репозитории Nixpkgs на гитхабе:
fcitx5-rime.nix. Главное не забыть выбрать корректную ветку (например,nixos-unstable). - Ввести в терминале
nix repl '<nixpkgs>'и ввести там:e pkgs.fcitx5-rime. После этого исходники пакета откроются в дефолтном текстовом редакторе. Кстати, у репла есть свой мануал, он откроется при вводе:?.
Для примера глянем исходники pkgs.hello:
# https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/applications/misc/hello/default.nix
{ callPackage
, lib
, stdenv
, fetchurl
, nixos
, testers
, hello
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
sha256 = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
doCheck = true;
# ...
})Видим аттрибуты pname, version, src и doCheck, которые можно переписать, используя overrideAttrs. Вот так можно изменить doCheck (пропускает фазу тестирования при сборке):
helloWithDebug = pkgs.hello.overrideAttrs (finalAttrs: previousAttrs: {
doCheck = false;
});Так же можно менять ряд дефолтных аттрибутов, определенных в stdenv.mkDerivation (а не экспрешне пакета). Для примера возьмем separateDebugInfo:
helloWithDebug = pkgs.hello.overrideAttrs (finalAttrs: previousAttrs: {
separateDebugInfo = true;
});Список таких аттрибутов можно посмотреть, введя :e stdenv.mkDerivation в nix repl '<nixpkgs>'.