Skip to content

yusdacra/nix-cargo-integration

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nix-cargo-integration

Easily and effortlessly integrate Cargo projects with Nix.

  • Uses dream2nix to build Cargo packages and provide a development shell.
  • Has sensible defaults, and strives to be compatible with Cargo.
  • Aims to offload work from the user; comes with useful configuration options.
  • It's a flake-parts module, so you can easily include it in existing Nix code that also use flake-parts.

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.