Have you been contemplating a switch to the Rust 2024 edition for your project, but are wondering how to go about it?
This is a description of my experience upgrading to the 2024 edition in a very large workspace. The workspace has close to 400 crates, and more than 1500 rust dependencies. It has a few years of history, and has been touched by a lot of developers with varying experience levels. Everything works on rust 1.84 using the 2021 edition, with no clippy warnings using the default lint settings.
The usual advice for upgrading to the new edition goes like this:
- Run
cargo fix --edition
- Add
edition = "2024"
toCargo.toml
That's not how I'm going to approach the upgrade. My reasons are:
- It's too big a change to take on all at once. This is a production codebase, and we need to be able to fix regressions. One giant commit touching thousands of lines of code across hundreds of crates doesn't lend itself to easy debugging or bisecting.
- We don't want all of the automatically generated changes. In a lot of places we would prefer the shorter temporary lifetimes in
if-let
expressions, rather than transforming them tomatch
expressions. And most of our macros will work just fine with the newly-expandedexpr
definitions. - I want to be able to explain the changes made to other engineers. To do that, I need to understand them myself.
- I want to be able to make changes in stages. If I can detect and fix issues ahead of time, in a way that's compatible with both the 2021 and 2024 editions, I definitely want to do it that way. This also means that changes can easily be reverted if I break something.
- The bigger the change, the longer it's going to take to code review. I want to see meaningful reviews, and that means limiting the size of each change.
- Any project with a lot of engineers has a lot of concurrent work. It's probably a bad time when you need everyone to stop working while a huge change lands. If we can make this transition look like ordinary daily progress, then that's better for everyone.
- It's a learning experience for all of us. I learned a bunch of new things about the language by going through this upgrade in detail, and I get to share that knowledge with the team, and add meaningful comments and commit messages conveying our understanding of the code.