title: "cargo2nix: Dramatically simpler Rust in Nix"
date: 2020-10-05 2
layout: post
lang: en
ref: cargo2nix-dramatically-simpler-rust-in-nix
In the same vein of my earlier post on swift2nix, I was able to quickly prototype a Rust and Cargo variation of it: cargo2nix.
The initial prototype is even smaller than swift2nix: it has only 37 lines of code.
Here's how to use it (snippet taken from the repo's README):
let
niv-sources = import ./nix/sources.nix;
mozilla-overlay = import niv-sources.nixpkgs-mozilla;
pkgs = import niv-sources.nixpkgs { overlays = [ mozilla-overlay ]; };
src = pkgs.nix-gitignore.gitignoreSource [ ] ./.;
cargo2nix = pkgs.callPackage niv-sources.cargo2nix {
lockfile = ./Cargo.lock;
};
in pkgs.stdenv.mkDerivation {
inherit src;
name = "cargo-test";
buildInputs = [ pkgs.latest.rustChannels.nightly.rust ];
phases = [ "unpackPhase" "buildPhase" ];
buildPhase = ''
# Setup dependencies path to satisfy Cargo
mkdir .cargo/
ln -s ${cargo2nix.env.cargo-config} .cargo/config
ln -s ${cargo2nix.env.vendor} vendor
# Run the tests
cargo test
touch $out
'';
}
That cargo test
part on line 20 is what I have been fighting with every
"*2nix" available for Rust out there. I don't want to bash any of them. All I
want is to have full control of what Cargo commands to run, and the "*2nix" tool
should only setup the environment for me. Let me drive Cargo myself, no need to
parameterize how the tool runs it for me, or even replicate its internal
behaviour by calling the Rust compiler directly.
Sure it doesn't support private registries or Git dependencies, but how much bigger does it has to be to support them? Also, it doesn't support those yet, there's no reason it can't be extended. I just haven't needed it yet, so I haven't added. Patches welcome.
The layout of the vendor/
directory is more explicit and public then what
swift2nix does: it is whatever the command cargo vendor
returns. However I
haven't checked if the shape of the .cargo-checksum.json
is specified, or
internal to Cargo.
Try out the demo (also taken from the repo's README):
pushd "$(mktemp -d)"
wget -O- https://euandre.org/static/attachments/cargo2nix-demo.tar.gz |
tar -xv
cd cargo2nix-demo/
nix-build
Report back if you wish.