• Stars
    star
    157
  • Rank 238,399 (Top 5 %)
  • Language
    Nix
  • License
    MIT License
  • Created over 3 years ago
  • Updated 11 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Library to easily and effortlessly integrate Cargo projects with Nix.

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.