Оверрайды
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>'
.