Notes (TRPL 01/21): Getting Started

1 Getting Started

1.1 Installing Rust (on NixOS)

I run NixOS, so I’m going to have to modify the installation instructions in the book in order to take advantage of all the awesome package management work that Nix already does for me.

First, I’m not going to use rustup. Instead, the way I’m going to manage which version of Rust is on my system is by using Mozilla’s Rust overlay for nixpkgs

A nixpkgs overlay is a way to customize the packages that are published in the official nixpkgs repository. We want to have easy access to all the different Rust versions, rather than whatever version happens to be in nixpkgs in the nixos or unstable channels. Fortunately for us, Mozilla maintains an overlay that lets us use nix to mimic rustup’s behavior.

This method (instructions in either of the above links) automatically installs the right rustc and cargo, so make sure you haven’t already installed rustc and cargo with nix-env or globally in environment.systemPackages, or you’ll get a package name collision.

Also, make sure you have gcc installed, since Rust needs a linker.

$ nix-env -iA nixos.gcc

Actually probably not a bad idea to put gcc in your configuration.nix system packages.

1.2 Hello, World!

[see hello_world/]

Okay, so apparently Rust has opinions about how I should indent my code. While I respect their desire for consistency of style between libraries, I also have a desire for consistency of my style across languages. My personal preference is for 2-space indents with an 80 character line length. That’s what I like, but when collaborating with other people I also always try to defer to the preference of the repository owner or primary author. I think that strikes a reasonable balance between staying true to my aesthetics and also being friendly.

(Some languages like Python enforces 4-space indentation as a matter of syntax. My policy is to not push-back against language-level syntax enforcement, except maybe by writing my code in a less draconian language, if reasonable)

I think what I’m gonna do here is install the rust-lang/rust.vim plugin and set:

let g:rust_recommended_style=0
let g:rustfmt_options='--config-path ~/.config/rustfmt/rustfmt.toml'
let g:rustfmt_autosave=1

in my .vimrc, which turns off the soft style recommendations, and runs rustfmt every time I write a buffer in vim, with a global format configuration file.

This is probably going to be annoying when I write Rust code that someone else touches, but I think as long as my global rustfmt.toml is only accessed by vim, I should be okay, since running rustfmt and cargo fmt from the command line will still format according to any local rustfmt.toml

1.3 Hello, Cargo!

Okay, so we’re also going to have to do a little funkiness to get nix and cargo to play nice together. We’re going to use a program called carnix that turns the Cargo.lock file that cargo generates into a nix expression that we can build with nix-build. The reason we want to do this is that when we start to manage dependencies, nix is a much more powerful than cargo. nix is a general purpose build-system and package manager that allows us to have reproducible, atomic builds. cargo, for all its virtues, only works with Rust packages (crates). So if we run into a situation where we have non-rust dependencies, nix is going to help us a lot.

Furthermore, since I’m running NixOS, and therefore already managing all my packages with nix, there’s some advantage to maintaining consistency. nix expressions compose (you can import one expression into another), so if I ever want to, e.g. combine Rust and PureScript into a single application, nix will be useful for that (since I’ve already figured out how to have nix manage Purescript’s build environment by integrating with psc-package and npm)

Instructions for how to use carnix are here:

These instructions are outdated, carnix’s UI has improved as of version 0.7;

$ cargo new hello
$ cd hello
$ carnix build
$ ./result/bin/hello
Hello, world!
$ cargo run
Hello, world!

Seems like there’s no wrapping for cargo check though.