Qu’est-ce qu’un Flake ?
Les Flakes sont une fonctionnalité expérimentale de Nix qui améliore la reproductibilité et la gestion des dépendances. Un Flake verrouille les versions exactes de toutes les dépendances.
Pourquoi utiliser les Flakes ?
- Reproductibilité totale : versions exactes verrouillées dans
flake.lock - Pas de canaux : les sources sont explicites
- Meilleure organisation : structure standardisée
- Composition facile : réutilisation de configurations
Activer les Flakes
Dans configuration.nix :
{
nix.settings.experimental-features = [ "nix-command" "flakes" ];
}
Puis sudo nixos-rebuild switch.
Structure d’un Flake
Un Flake est défini par un fichier flake.nix :
{
description = "Ma configuration NixOS";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
};
outputs = { self, nixpkgs }: {
nixosConfigurations.mon-serveur = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
];
};
};
}
Convertir une configuration existante en Flake
Structure de fichiers :
/etc/nixos/
├── flake.nix
├── flake.lock # généré automatiquement
├── configuration.nix
└── hardware-configuration.nix
Créer flake.nix :
{
description = "Configuration NixOS";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
};
outputs = { self, nixpkgs }: {
nixosConfigurations.mon-serveur = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
];
};
};
}
Générer le lock file :
cd /etc/nixos
sudo nix flake update
Appliquer la configuration :
sudo nixos-rebuild switch --flake .#mon-serveur
Commandes Flake courantes
Mettre à jour les dépendances :
nix flake update
Mettre à jour une seule dépendance :
nix flake lock --update-input nixpkgs
Voir les entrées du Flake :
nix flake show
Vérifier le Flake :
nix flake check
Exemple avec Home Manager
Les Flakes permettent d’intégrer facilement Home Manager :
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
home-manager = {
url = "github:nix-community/home-manager/release-24.05";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, home-manager }: {
nixosConfigurations.mon-serveur = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.admin = import ./home.nix;
}
];
};
};
}
Multi-machines avec Flakes
Un Flake peut définir plusieurs configurations :
{
outputs = { self, nixpkgs }: {
nixosConfigurations = {
serveur-web = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ ./machines/serveur-web.nix ];
};
serveur-db = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ ./machines/serveur-db.nix ];
};
};
};
}
Déployer :
sudo nixos-rebuild switch --flake .#serveur-web
sudo nixos-rebuild switch --flake .#serveur-db
Avantages des Flakes
| Sans Flakes | Avec Flakes |
|---|---|
| Canaux système | Sources explicites |
| Versions flottantes | Versions verrouillées |
| Difficile à partager | Facilement reproductible |
| Mise à jour globale | Mise à jour granulaire |