Nix
Package manager and functional language for reproducible environments. Run any tool once without installing it permanently.
Running Packages
Execute a package from nixpkgs directly:
nix run nixpkgs#cowsay -- "Hello!" # Run with arguments
nix run nixpkgs#hello # Simple command
For long-running services, wrap in tmux: tmux new -d 'nix run nixpkgs#some-server'.
Shell Environments
Create a temporary shell with specific tools:
nix shell nixpkgs#git nixpkgs#vim --command git --version
Evaluating Expressions
Debug and inspect Nix expressions in headless environments:
nix eval --expr '1 + 2' # Simple expression
nix eval nixpkgs#hello.name # Inspect an attribute
nix eval --file ./default.nix # Evaluate a local file
nix eval --expr 'builtins.attrNames (import <nixpkgs> {})' # List keys
Searching Packages
nix search nixpkgs python3 # Search by name or description
Formatting Nix Files
nix fmt # Format current directory
nix fmt -- --check # Check formatting without changes
Hashes
Never pre-compute hashes with nix-prefetch-url, nix hash (file, path, convert, etc.), or nix-hash. These commands are blocked.
Set the hash to "" in your fetchSource and let the build fail with a got: error that reports the correct hash:
fetchFromGitHub {
owner = "nixos";
repo = "nixpkgs";
rev = "abc123";
hash = ""; # let the build tell you the correct hash
}
Shebang Scripts
Use Nix as a script interpreter:
#!/usr/bin/env nix
#! nix shell nixpkgs#bash nixpkgs#curl --command bash
curl -s https://example.com
Rules
- Use
nix log <derivation>to debug broken builds - Use
nix why-dependsto trace dependency chains - Add
--no-substituteto force local build when cache is bad - Use shebang scripts (
#! nix shell ... --command) for inline nix scripts