Offline Rust

Rust, and its respective package manager, Cargo, easily allow for programming on the go. You can use sccache to cache dependencies you’ve already downloaded, so if you’ve already downloaded them, there’s no need to redownload them for any other project you use the same dependency for. Sadly, that stops short when you want to download a new dependency you’ve never downloaded before. If you’re offline and don’t have that exact dependency cached, you’re SOL. But we can do better, can’t we?

You probably already know that crates.io is a thin layer over git. So, you can grep all the crates on it, download their source code, and host your own local repository that acts as a stand-in for crates.io. Luckily (if you have ~150GB to spare), there’s already a project that has done that for us: panamax. After you install it with cargo (b)install panamax, and initialize some directory. I initialized one at ~/crates with panamax init ~/crates.

You’ll want to set your config up: I didn’t want to clone any toolchains since I didn’t need them, so I only cloned down the crates: I edited my mirror.toml inside the initialized repository to be the following:

[mirror]
retries = 5
[rustup]
sync = false
[crates]
sync = true
download_threads = 64
source = "https://crates.io/api/v1/crates"
source_index = "https://github.com/rust-lang/crates.io-index"
base_url = "http://localhost:27428/crates"

And then I ran panamax sync ~/crates and waited for a day for the internet to download all the crates.

Once that’s done, we have all the crates we need. Add these lines to your cargo config (normally at ~/.cargo/config.toml) to use the new repository:

[source.panamax-sparse]
registry = "sparse+http://localhost:27428/index/"

[source.crates-io]
replace-with = "panamax-sparse"

Start up the server with panamax serve ~/crates --port=27428 and you’re ready to code offline in rust.

For maintenance, I sync crates with panamax sync ~/crates once a week with systemd and that works for me.