Home

Awesome

nix-cargo-integration

Easily and effortlessly integrate Cargo projects with Nix.

Documentation

Documentation for master branch is on flake-parts website (alternatively, read options directly in src/interface.nix and src/modules).

Examples can be found at examples directory. Also see the discussions for answers to possible questions.

Important (mostly breaking) changes can be found in CHANGELOG.md.

Installation

Run nix flake init -t github:yusdacra/nix-cargo-integration to initialize a simple flake.nix.

You can also run nix flake init -t github:yusdacra/nix-cargo-integration#simple-crate to initialize a Cargo crate alongside the flake.nix, or nix flake init -t github:yusdacra/nix-cargo-integration#simple-workspace for a Cargo workspace with a flake.nix.

If you already have a flake.nix with flake-parts setup, just add NCI to inputs:

{
  # ...
  inputs.nci.url = "github:yusdacra/nix-cargo-integration";
  # ...
}

and then inside the mkFlake:

{
  imports = [
    inputs.nci.flakeModule
  ];
}

Tips and tricks

Ignoring Cargo.lock in Rust libraries

The official recommendation for Rust libraries used to say to add Cargo.lock to the .gitignore. This is now no longer the case, however older projects may still do this, which will cause conflicts with the way paths are evaluated when using a flake.nix. Only files tracked by the version control system (i.e. git) can be accessed during evaluation. This will manifest in the following warning:

$ nix build
trace: Cargo.lock not found for project at path path/to/project.
Please ensure the lockfile exists for your project.
If you are using a VCS, ensure the lockfile is added to the VCS and not ignored (eg. run `git add path/to/project/Cargo.lock` for git).

This project will be skipped and won't have any outputs generated.
Run `nix run .#generate-lockfiles` to generate lockfiles for projects that don't have one.

A neat fix for that is to track the path to Cargo.lock without staging it (thanks to @bew).

$ git add --intent-to-add Cargo.lock

Add --force if your Cargo.lock is listed in .gitignore.