crate2nix generates Nix build files for
Rust/Cargo projects,
building each crate individually for precise, incremental rebuilds.
- Incremental CI builds -- only rebuild the crates that actually changed.
- Full Nix integration -- remote builds, binary caches, Docker images, NixOS modules.
- Local dev unchanged -- keep using
cargoandrust-analyzeras usual.
nix run nixpkgs#crate2nix -- generate
nix build -f Cargo.nix rootCrate.buildnix flake init --template github:nix-community/crate2nix# From nixpkgs
nix profile install nixpkgs#crate2nix
# Latest development version
nix profile install github:nix-community/crate2nixThen, inside your project:
crate2nix generate # creates Cargo.nix
nix build -f Cargo.nix rootCrate.buildcrate2nix reads Cargo.toml and Cargo.lock, resolves the full dependency
tree via cargo metadata, prefetches source hashes, and renders a Cargo.nix
file through Tera templates. The generated file contains one Nix derivation per
crate, so Nix rebuilds only what changed.
Two generation strategies are supported:
| Strategy | Pros | Cons |
|---|---|---|
Manual (crate2nix generate) |
No IFD, full build parallelism | Must regenerate when deps change |
| Auto (Import From Derivation) | Always in sync with Cargo.lock |
May reduce parallelism |
tools.nix exposes helpers for use in your own Nix expressions:
let
crate2nix = builtins.fetchTarball "https://github.com/nix-community/crate2nix/tarball/master";
tools = import "${crate2nix}/tools.nix" { inherit pkgs; };
generated = tools.generatedCargoNix {
name = "my-project";
src = ./.;
};
project = pkgs.callPackage "${generated}/default.nix" {};
in
project.rootCrate.buildOr the shorthand appliedCargoNix which combines generation and import.
Full documentation is at https://nix-community.github.io/crate2nix/, covering:
- Installation options
- Generation strategies
- Building binaries
- Feature selection
- Crate overrides
- Known restrictions
- Changelog
Contributions are welcome! See the contributing guide for details.
Apache-2.0