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.
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 # Basic flake in current directory
nix flake new hello -t templates#hello # From template
Manage dependencies:
nix flake update # Update all inputs in flake.lock
nix flake update nixpkgs # Update specific input only
nix flake lock # Lock missing entries without updating
Building & Running
Always prefix local paths with path: to include untracked files:
nix build path:. # Build default package
nix build path:.#packageName # Build a specific output
nix run path:. # Run the default app
nix run path:.#appName # Run a specific app
nix run github:numtide/treefmt # Run from a remote flake
Development Environments
Run commands inside a devShell:
nix develop path:. --command make build
nix develop path:. --command env # Check the environment
The --command flag is required in headless environments to avoid interactive mode.
Inspecting Flakes
nix flake show path:. # List all outputs
nix flake metadata path:. # See inputs and revisions
nix eval path:.#packages.x86_64-linux.default.name # Evaluate a specific output
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.lockfor reproducibility - Use
path:prefix when building local flakes to include untracked files - Always use
--commandwithnix developin scripts and headless environments
Related Skills
- nix: Run packages temporarily and evaluate expressions
- nh: Cleaner interface for NixOS/Home Manager operations