| name | nix-flakes |
| description | Creates reproducible builds, manages flake inputs, defines devShells, and builds packages with flake.nix. Use when initializing Nix projects, locking dependencies, or running nix build/develop commands. |
| license | MIT |
| compatibility | cross-agent |
| metadata | {"imported":true,"source":"/home/mdupont/.agents/skills/nix-flakes/SKILL.md"} |
Nix Flakes
Modern Nix project management with hermeticity through flake.lock. Every dependency is locked to a specific revision for reproducibility.
Project Setup
Initialize a new flake:
nix flake init
nix flake new hello -t templates#hello
Manage dependencies:
nix flake update
nix flake update nixpkgs
nix flake lock
Building & Running
Always prefix local paths with path: to include untracked files:
nix build path:.
nix build path:.#packageName
nix run path:.
nix run path:.#appName
nix run github:numtide/treefmt
Development Environments
Run commands inside a devShell:
nix develop path:. --command make build
nix develop path:. --command env
The --command flag is required in headless environments to avoid interactive mode.
Inspecting Flakes
nix flake show path:.
nix flake metadata path:.
nix eval path:.#packages.x86_64-linux.default.name
Basic Flake Structure
{
description = "A basic flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
packages.${system}.default = pkgs.hello;
devShells.${system}.default = pkgs.mkShell {
buildInputs = [ pkgs.git pkgs.vim ];
};
};
}
Best Practices
- Always commit
flake.lock for reproducibility
- Use
path: prefix when building local flakes to include untracked files
- Always use
--command with nix develop in scripts and headless environments
Related Skills
- nix: Run packages temporarily and evaluate expressions
- nh: Cleaner interface for NixOS/Home Manager operations