From 020c1e77489b772f854bb3288b9c8d2818a6bf9d Mon Sep 17 00:00:00 2001
From: EuAndreh <eu@euandre.org>
Date: Fri, 18 Apr 2025 02:17:12 -0300
Subject: git mv src/content/* src/content/en/

---
 src/content/en/blog/2020/10/05/cargo2nix.adoc | 72 +++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)
 create mode 100644 src/content/en/blog/2020/10/05/cargo2nix.adoc

(limited to 'src/content/en/blog/2020/10/05/cargo2nix.adoc')

diff --git a/src/content/en/blog/2020/10/05/cargo2nix.adoc b/src/content/en/blog/2020/10/05/cargo2nix.adoc
new file mode 100644
index 0000000..a2d478e
--- /dev/null
+++ b/src/content/en/blog/2020/10/05/cargo2nix.adoc
@@ -0,0 +1,72 @@
+= cargo2nix: Dramatically simpler Rust in Nix
+:sort: 1
+
+:empty:
+:swift2nix: link:swift2nix.html
+:cargo2nix: link:cargo2nix-demo.tar.gz
+
+In the same vein of my earlier post on {swift2nix}[swift2nix], I was able to
+quickly prototype a Rust and Cargo variation of it: {cargo2nix}[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):
+
+[source,nix]
+----
+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):
+
+[source,sh]
+----
+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.
-- 
cgit v1.2.3

