Awesome
nix-cargo-integration
Easily and effortlessly integrate Cargo projects with Nix.
- Uses dream2nix to build Cargo packages and provide a development shell (dream2nix default, also supports numtide devshell, check examples).
- It's a flake-parts module, so you can easily include it in existing Nix code that also use
flake-parts
. - Has sensible defaults, and strives to be compatible with Cargo.
- Aims to offload work from the user; comes with useful configuration options.
Documentation
Documentation for master
branch is on https://flake.parts/options/nix-cargo-integration.html
(alternatively, read options directly in src/interface.nix
and src/modules
)
Examples can be found at examples
directory.
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
.