nix-flakes
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
More from knoopx/pi
podman
Manages containers, builds images, configures pods and networks with Podman. Use when running containers, creating Containerfiles, grouping services in pods, or managing container resources.
122jujutsu
Manages version control with Jujutsu (jj), including rebasing, conflict resolution, and Git interop. Use when tracking changes, navigating history, squashing/splitting commits, or pushing to Git remotes.
117scraping
Fetches web pages, parses HTML with CSS selectors, calls REST APIs, and scrapes dynamic content. Use when extracting data from websites, querying JSON APIs, or automating browser interactions.
48jscpd
Finds duplicate code blocks and analyzes duplication metrics across files. Use when identifying copy-pasted code, measuring technical debt, or preparing for refactoring.
45yt-dlp
Downloads videos from YouTube and other sites using yt-dlp. Use when downloading videos, extracting metadata, or batch downloading multiple files.
42nix
Runs packages temporarily, creates isolated shell environments, and evaluates Nix expressions. Use when executing tools without installing, debugging derivations, or working with nixpkgs.
42