Skip to content
On this page

Обновлнение и откат пакетов

В определенных ситуациях может понадобиться обновить или откатить к предыдущей версии какой-либо из установленных пакетов (например, когда в новой версии заводятся баги). При использовании флейков для этого нужно проинструктировать Nix брать пакет из определенного коммита в репозитории (pinning).

Так можно добавить в флейк несколько версий nixpkgs c различными коммитами:

nix
{
  description = "NixOS configuration of Ryan Yin";

  inputs = {
    # дефолтный nixos-unstable
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

    # Последняя стабильная версия (для отката версий пакетов)
    # На текущий момент 23.05
    nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-23.05";

    # Конкретный коммит можно добавить через его хэш
    nixpkgs-fd40cef8d.url = "github:nixos/nixpkgs/fd40cef8d797670e203a27a91e4b8e6decf0b90c";
  };

  outputs = inputs@{
    self,
    nixpkgs,
    nixpkgs-stable,    # добавляем новые инпуты
    nixpkgs-fd40cef8d, # добавляем новые инпуты
    ...
  }: {
    nixosConfigurations = {
      nixos-test = nixpkgs.lib.nixosSystem rec {
        system = "x86_64-linux";

        # `specialArgs` для передачи других версий nixpkgs в модули
        specialArgs = {
          # Чтобы поставить пакет из ветки nixpkgs-stable,
          # нужно указать для нее ряд параметров
          pkgs-stable = import nixpkgs-stable {
            # использовать `system`, указанный ранее
            system = system;
            # Для проприетарного мусора, вроде хрома
            config.allowUnfree = true;
          };
          pkgs-fd40cef8d = import nixpkgs-fd40cef8d {
            system = system;
            config.allowUnfree = true;
          };
        };

        modules = [
          ./hosts/nixos-test

          # ... бла-бла-бла ...
        ];
      };
    };
  };
}

Теперь в модулях можно обращаться к pkgs-stable или pkgs-fd40cef8d. В случае модуля для Home Manager выглядит так:

nix
{
  pkgs,
  config,
  # Nix will search for and inject this parameter
  # from `specialArgs` in `flake.nix`
  pkgs-stable,
  # pkgs-fd40cef8d,
  ...
}:

{
  # Установка из `pkgs-stable` вместо `pkgs`
  home.packages = with pkgs-stable; [
    firefox-wayland

    # В Chrome из nixos-unstable отвалилась поддержка Wayland,
    # так что ставим из стабильной ветки
    # https://github.com/swaywm/sway/issues/7562
    google-chrome
  ];

  programs.vscode = {
    enable = true;
    # Refer to vscode from `pkgs-stable` instead of `pkgs`
    package = pkgs-stable.vscode;
  };
}

После этого sudo nixos-rebuild switch откатит версии Firefox/Chrome/VSCode до таковых из nixpkgs-stable или nixpkgs-fd40cef8d.

Если верить 1000 instances of nixpkgs, смена ветки во вложенных модулях с помощью import - плохая идея, т.к. каждый вызов функции создает новый nixpkgs, что с увеличением размера конфига все более негативно влияет на потребление ресурсов ПК и время сборки. Вместо этого все инстансы nixpkgs объявляются в flake.nix.