Sobrescrevendo com override
No Nix, você pode customizar pacotes pkgs
usando a função override
, que permite definir parâmetros de build customizados e retorna uma nova derivation com os valores sobrescritos. Vamos dar uma olhada em um exemplo:
pkgs.fcitx5-rime.override { rimeDataPkgs = [ ./rime-data-flypy ]; }
No exemplo acima, sobrescrevemos o parâmetro rimeDataPkgs
da derivation fcitx5-rime
para usar um pacote customizado chamado rime-data-flypy
. Isso cria uma nova derivation onde rimeDataPkgs
é sobrescrito, enquanto outros parâmetros permanecem inalterados.
Para descobrir quais parâmetros de um pacote específico podem ser sobrescritos, existem algumas abordagens que você pode seguir:
- Verifique o código-fonte do pacote no repositório Nixpkgs no GitHub, como
fcitx5-rime.nix
. Certifique-se de selecionar o ramo apropriado, comonixos-unstable
, se você estiver usando esse ramo. - Use o comando
nix repl -f '<nixpkgs>'
para abrir um REPL (Read-Eval-Print Loop) Nix e, em seguida, digite:e pkgs.fcitx5-rime
. Isso abrirá o código-fonte do pacote em seu editor padrão, onde você pode ver todos os parâmetros do pacote. Para aprender o uso básico donix repl
, você pode digitar:?
para ver a informação de ajuda.
Usando esses métodos, você pode descobrir os parâmetros de entrada de um pacote e determinar quais podem ser modificados usando override
.
Por exemplo, vamos dar uma olhada no código-fonte de pkgs.hello:
{ 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;
# ...
})
Neste exemplo, os atributos pname
, version
, src
e doCheck
podem todos ser sobrescritos usando overrideAttrs
. Por exemplo:
helloWithDebug = pkgs.hello.overrideAttrs (finalAttrs: previousAttrs: {
doCheck = false;
});
No código acima, usamos overrideAttrs
para sobrescrever o atributo doCheck
, enquanto deixamos os outros atributos inalterados.
Você também pode sobrescrever alguns atributos padrão definidos em stdenv.mkDerivation
usando overrideAttrs
. Por exemplo:
helloWithDebug = pkgs.hello.overrideAttrs (finalAttrs: previousAttrs: {
separateDebugInfo = true;
});
Neste caso, sobrescrevemos o atributo separateDebugInfo
, que é definido em stdenv.mkDerivation
, e não no código-fonte de hello
.
Para ver todos os atributos definidos em stdenv.mkDerivation
, você pode verificar seu código-fonte usando nix repl -f '<nixpkgs>'
e digitando :e stdenv.mkDerivation
.
Isso abrirá o código-fonte em seu editor padrão. Se você é novo no uso do nix repl
, pode digitar :?
para ver a informação de ajuda.