xzfc / cached-nix-shell

Instant startup time for nix-shell
https://xzfc.github.io/cached-nix-shell/cached-nix-shell.1
The Unlicense
195 stars 16 forks source link
nix nix-shell

cached-nix-shell

Build Status License Nixpkgs unstable package Man page

cached-nix-shell is a caching layer for nix-shell featuring instant startup time on subsequent runs.

It supports NixOS and Linux.

Installation

Install the release version from Nixpkgs:

nix-env -iA nixpkgs.cached-nix-shell

Or, install the latest development version from GitHub:

nix-env -if https://github.com/xzfc/cached-nix-shell/tarball/master

Usage

Just replace nix-shell with cached-nix-shell in the shebang line:

#! /usr/bin/env cached-nix-shell
#! nix-shell -i python3 -p python
print("Hello, World!")

Alternatively, call cached-nix-shell directly:

$ cached-nix-shell ./hello.py
$ cached-nix-shell -p python3 --run 'python --version'

Or use the --wrap option for programs that call nix-shell internally.

$ cached-nix-shell --wrap stack build

Performance

$ time ./hello.py # first run; no cache used
cached-nix-shell: updating cache
Hello, World!
./hello.py  0.33s user 0.06s system 91% cpu 0.435 total
$ time ./hello.py
Hello, World!
./hello.py  0.02s user 0.01s system 97% cpu 0.029 total

Caching and cache invalidation

cached-nix-shell stores environment variables set up by nix-shell and reuses them on subsequent runs. It traces which files are read by nix during an evaluation, and performs a proper cache invalidation if any of the used files are changed. The cache is stored in ~/.cache/cached-nix-shell/.

The following situations are covered:

The following situations aren't handled by cached-nix-shell and may lead to staled cache:

Related