Fazendo Downgrade ou Upgrade de Pacotes
Ao trabalhar com Flakes, você pode encontrar situações em que precisa fazer o downgrade ou upgrade de certos pacotes para resolver bugs ou problemas de compatibilidade. Em Flakes, as versões dos pacotes e os valores de hash estão diretamente vinculados ao commit do Git de sua entrada de flake. Para modificar a versão de um pacote, você precisa bloquear o commit do Git da entrada de flake.
Aqui está um exemplo de como você pode adicionar múltiplas entradas nixpkgs, cada uma usando um commit ou ramo diferente do Git:
{
description = "NixOS configuration of Ryan Yin";
inputs = {
# Padrão para o ramo nixos-unstable
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
# Último ramo estável do nixpkgs, usado para rollback de versão
# A última versão atual é 25.05
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05";
# Você também pode usar um hash de commit específico do git para bloquear a versão
nixpkgs-fd40cef8d.url = "github:nixos/nixpkgs/fd40cef8d797670e203a27a91e4b8e6decf0b90c";
};
outputs = inputs@{
self,
nixpkgs,
nixpkgs-stable,
nixpkgs-fd40cef8d,
...
}: {
nixosConfigurations = {
my-nixos = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
# O parâmetro specialArgs passa as instâncias nixpkgs não padrão para outros módulos nix
specialArgs = {
# Para usar pacotes do nixpkgs-stable,
# primeiro configuramos alguns parâmetros para ele
pkgs-stable = import nixpkgs-stable {
# Referir-se ao parâmetro system do escopo externo recursivamente
inherit system;
# Para usar o Chrome, precisamos permitir a instalação de software não livre.
config.allowUnfree = true;
};
pkgs-fd40cef8d = import nixpkgs-fd40cef8d {
inherit system;
config.allowUnfree = true;
};
};
modules = [
./hosts/my-nixos
# Omitir outras configurações...
];
};
};
};
}
No exemplo acima, definimos múltiplas entradas nixpkgs: nixpkgs
, nixpkgs-stable
e nixpkgs-fd40cef8d
. Cada entrada corresponde a um commit ou ramo diferente do Git.
Em seguida, você pode referenciar os pacotes de pkgs-stable
ou pkgs-fd40cef8d
dentro do seu submódulo. Aqui está um exemplo de um submódulo do Home Manager:
{
pkgs,
config,
# O Nix irá procurar e injetar este parâmetro
# de specialArgs em flake.nix
pkgs-stable,
# pkgs-fd40cef8d,
...
}:
{
# Use pacotes de `pkgs-stable` em vez de `pkgs`
home.packages = with pkgs-stable; [
firefox-wayland
# O suporte ao Chrome Wayland estava quebrado no ramo nixos-unstable,
# então voltamos para o ramo estável por enquanto.
# Referência: https://github.com/swaywm/sway/issues/7562
google-chrome
];
programs.vscode = {
enable = true;
# Referir-se ao vscode de `pkgs-stable` em vez de `pkgs`
package = pkgs-stable.vscode;
};
}
Fixando a versão de um pacote com um overlay
A abordagem acima é perfeita para pacotes de aplicação, mas às vezes você precisa substituir bibliotecas usadas por esses pacotes. É aqui que os Overlays brilham! Os Overlays podem editar ou substituir qualquer atributo de um pacote, mas por enquanto vamos apenas fixar um pacote a uma versão diferente do nixpkgs. A principal desvantagem de editar uma dependência com um overlay é que sua instalação Nix irá recompilar todos os pacotes instalados que dependem dela, mas sua situação pode exigir isso para correções de bugs específicos.
# overlays/mesa.nix
{ config, pkgs, lib, pkgs-fd40cef8d, ... }:
{
nixpkgs.overlays = [
# Overlay: Use `self` e `super` para expressar
# a relação de herança
(self: super: {
mesa = pkgs-fd40cef8d.mesa;
})
];
}
Aplicando a nova configuração
Ao ajustar a configuração conforme mostrado acima, você pode implantá-la usando sudo nixos-rebuild switch
. Isso fará o downgrade das suas versões do Firefox/Chrome/VSCode para as correspondentes a nixpkgs-stable
ou nixpkgs-fd40cef8d
.
De acordo com 1000 instâncias de nixpkgs, não é uma boa prática usar
import
em submódulos ou subflakes para personalizar onixpkgs
. Cadaimport
cria uma nova instância do nixpkgs, o que aumenta o tempo de build e o uso de memória à medida que a configuração cresce. Para evitar esse problema, criamos todas as instâncias do nixpkgs emflake.nix
.