Введение в конфигурации Denix (флейки)
Функция delib.configurations
используется для создания списков nixosConfigurations
, homeConfigurations
и darwinConfigurations
для флейков.
Помимо всех хостов, она также добавляет комбинации каждого хоста с каждым не inheritanceOnly
райсом, что позволяет быстро переключаться между райсами без редактирования кода. Например, если у хоста "desktop" задан райс "light", то при выполнении следующей команды:
nixos-rebuild switch --flake .#desktop --use-remote-sudo
будет использован хост "desktop" с райсом "light". Однако, если необходимо быстро переключиться на другой райс, например, на "dark", можно выполнить следующую команду:
nixos-rebuild switch --flake .#desktop-dark --use-remote-sudo
В этом случае хост останется "desktop", но райс изменится на "dark".
Важно отметить, что при смене райса таким образом меняется только значение опции ${myConfigName}.rice
, при этом значение ${myconfigName}.hosts.${hostName}.rice
остаётся прежним.
Принцип генерации списка конфигураций
Список конфигураций генерируется по следующему принципу:
{hostName}
- гдеhostName
- имя любого хоста.{hostName}-{riceName}
- гдеhostName
- имя любого хоста, аriceName
- имя любого райса, у которогоinheritanceOnly
равноfalse
.
Если moduleSystem
из аргументов функции равен home
, то ко всем конфигурациям в списке добавляется префикс {homeManagerUser}@
.
Пример
Пример outputs
флейка для nixosConfigurations
, homeConfigurations
и darwinConfigurations
:
outputs = {denix, ...} @ inputs: let
mkConfigurations = moduleSystem:
denix.lib.configurations rec {
inherit moduleSystem;
homeManagerUser = "sjohn";
paths = [./hosts ./modules ./rices];
specialArgs = {
inherit inputs moduleSystem homeManagerUser;
};
};
in {
nixosConfigurations = mkConfigurations "nixos";
homeConfigurations = mkConfigurations "home";
darwinConfigurations = mkConfigurations "darwin";
}
Использование нескольких каналов
Для удобной работы с несколькими каналами в конфигурации функция delib.configurations
принимает аргументы nixpkgs
, home-manager
и nix-darwin
, которые используются в сгенерированных конфигурациях.
По умолчанию эти аргументы указывать не требуется - они равны соответствующим значениям из inputs
флейка Denix. Эти значения можно также переопределить через inputs.denix.inputs.<input>.follows
, однако такой способ больше подходит тем, кто использует только один канал.
Таким образом:
delib.configurations :: [nixpkgs, home-manager, nix-darwin]
- для тех, кому нужно несколько каналов.inputs.denix.<nixpkgs|home-manager|nix-darwin>.follows
- для тех, кому достаточно одного канала.
Исходя из этого, возможны следующие варианты использования:
- Переопределение
nixpkgs
,home-manager
иnix-darwin
через аргументы функцииdelib.configurations
на каналы "stable" и "unstable" для./hosts/stable
и./hosts/unstable
соответственно. Обратите внимание, что реализация функцииmkConfigurations
в этом примере может быть произвольной - это лишь демонстрация подхода.
{
inputs = {
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05";
home-manager-unstable = {
url = "github:nix-community/home-manager/master";
inputs.nixpkgs.follows = "nixpkgs-unstable";
};
home-manager-stable = {
url = "github:nix-community/home-manager/release-25.05";
inputs.nixpkgs.follows = "nixpkgs-stable";
};
nix-darwin-unstable = {
url = "github:nix-darwin/nix-darwin/master";
inputs.nixpkgs.follows = "nixpkgs-unstable";
};
nix-darwin-stable = {
url = "github:nix-darwin/nix-darwin/nix-darwin-25.05";
inputs.nixpkgs.follows = "nixpkgs-stable";
};
denix.url = "github:yunfachi/denix";
};
outputs = {
denix,
nixpkgs-unstable,
nixpkgs-stable,
home-manager-unstable,
home-manager-stable,
nix-darwin-unstable,
nix-darwin-stable,
...
} @ inputs: let
_mkConfigurations = nixpkgs: home-manager: nix-darwin: hosts: moduleSystem:
denix.lib.configurations {
inherit moduleSystem nixpkgs home-manager nix-darwin;
homeManagerUser = "sjohn";
paths = [./modules ./rices] ++ hosts;
specialArgs = {
inherit inputs;
};
};
mkConfigurations = moduleSystem:
nixpkgs-unstable.lib.attrsets.mergeAttrsList
(map (f: f moduleSystem) [
(_mkConfigurations nixpkgs-stable home-manager-stable nix-darwin-stable [./hosts/stable])
(_mkConfigurations nixpkgs-unstable home-manager-unstable nix-darwin-unstable [./hosts/unstable])
]);
in {
nixosConfigurations = mkConfigurations "nixos";
homeConfigurations = mkConfigurations "home";
darwinConfigurations = mkConfigurations "darwin";
};
}
- Переопределение
nixpkgs
,home-manager
иnix-darwin
черезinputs.denix.inputs.<name>.follows
. Это рекомендуемый способ для тех, кто использует только один канал.
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager/master";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-darwin = {
url = "github:nix-darwin/nix-darwin/master";
inputs.nixpkgs.follows = "nixpkgs";
};
denix = {
url = "github:yunfachi/denix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
inputs.nix-darwin.follows = "nix-darwin";
};
};
outputs = {denix, ...} @ inputs: let
mkConfigurations = moduleSystem:
denix.lib.configurations {
inherit moduleSystem;
homeManagerUser = "sjohn";
paths = [./hosts ./modules ./rices];
specialArgs = {
inherit inputs;
};
};
in {
nixosConfigurations = mkConfigurations "nixos";
homeConfigurations = mkConfigurations "home";
darwinConfigurations = mkConfigurations "darwin";
};
}
- Не переопределять ничего. Также вариант для использования одного канала, но менее рекомендуемый.
{
inputs = {
denix.url = "github:yunfachi/denix";
};
outputs = {denix, ...} @ inputs: let
mkConfigurations = moduleSystem:
denix.lib.configurations {
inherit moduleSystem;
homeManagerUser = "sjohn";
paths = [./hosts ./modules ./rices];
specialArgs = {
inherit inputs;
};
};
in {
nixosConfigurations = mkConfigurations "nixos";
homeConfigurations = mkConfigurations "home";
darwinConfigurations = mkConfigurations "darwin";
};
}