profile picture

13 pages tagged with "semver"

SemVer in Rust: Tooling, Breakage, and Edge Cases — FOSDEM 2024

March 18, 2024 - 10726 words - 54 mins
Last month, I gave a talk titled "SemVer in Rust: Breakage, Tooling, and Edge Cases" at the FOSDEM 2024 conference. The talk is a practical look at what semantic versioning (SemVer) buys us, why SemVer goes wrong in practice, and how the cargo-semver-checks linter can help prevent the damage caused … read more

Four challenges cargo-semver-checks has yet to tackle

January 23, 2024 - 2117 words - 11 mins

My last post covered the key cargo-semver-checks achievements from 2023. Here are the biggest challenges that lie ahead!

Many of the remaining challenges in cargo-semver-checks are obvious: we all want more lints, fewer false-positives, etc. etc. Let's set those aside.

Instead, let's talk about four non-obvious challenges we have yet to tackle:

read more

Highlights of 2023 for cargo-semver-checks

January 16, 2024 - 1679 words - 9 mins

2023 was a big year for cargo-semver-checks! We saw ecosystem-wide adoption in projects of all shapes and sizes: the tokio and PyO3 ecosystems, company-backed OSS projects from companies like Amazon and Google, and even in cargo itself. Here's a look back at the highlights of 2023!

read more

Checking semver in the presence of doc(hidden) items

November 18, 2023 - 2882 words - 15 mins

cargo-semver-checks v0.25 squashes nearly all bugs related to doc(hidden) items — its most common source of false-positives. What does doc(hidden) mean in Rust, and why was handling it correctly so hard?

read more

Semver violations are common, better tooling is the answer

September 07, 2023 - 3270 words - 17 mins
This post is coauthored by Tomasz Nowak and Predrag Gruevski. It describes work the two of us did together with Bartosz Smolarczyk, Michał Staniewski, and Mieszko Grodzicki. Anecdotally, cargo-semver-checks is a helpful tool for preventing the semver violations that every so often cause ecosystem-wi… read more

Breaking semver in Rust by adding a private type, or by adding an import

May 08, 2023 - 3718 words - 19 mins

A few days ago, I started polls on Mastodon and Twitter whether adding a new private type, or an import, can ever be a major breaking change. The consensus was that this should be impossible.

I agree with that. It should be impossible.

I've discovered a way to cause a previously-public type or function to disappear from a crate's public API by making innocuous-seeming changes like adding a private type or adding an import, etc. It is not a hypothetical problem, either — I've found at least one real-world Rust project that has been affected by it.

read more

Re-exporting an enum with a type alias is breaking, but not major

March 06, 2023 - 813 words - 5 mins

We've already explored some of the dark corners of Rust semantic versioning on this blog:

read more

Speeding up Rust semver-checking by over 2000x

February 07, 2023 - 3926 words - 20 mins

This post describes work in progress: how cargo-semver-checks will benefit from the upcoming query optimization API in the Trustfall query engine. Read on to learn how a modern linter works under the hood, and how ideas from the world of databases can improve its performance.

read more

Moving and re-exporting a Rust type can be a major breaking change

January 31, 2023 - 1194 words - 6 mins
I recently embarked on a quest: revamp the cargo-semver-checks import-handling system so that moving and re-exporting an item stops being incorrectly flagged as a major breaking change. This is how crate authors can reorganize or rename items: just re-export the items in the original location under … read more

Some Rust breaking changes don't require a major version

January 26, 2023 - 1848 words - 10 mins
I've been saying for a while now that semantic versioning in Rust is tricky and full of unexpected edge cases. My last post mentioned that some Rust structs can be converted into enums without requiring a major version bump. It introduced a non-exhaustive struct called Chameleon that had no public f… read more

Turning a Rust struct into an enum is not always a major breaking change

January 24, 2023 - 1611 words - 9 mins
EDIT: The Rust API evolution RFC distinguishes between breaking changes and changes that require a new semver-major version (called major changes). All major changes are breaking, but not all breaking changes are major. Changing a struct to an enum is always breaking (as pointed out on r/rust) but i… read more

cargo-semver-checks today and in 2023

December 23, 2022 - 1946 words - 10 mins
cargo-semver-checks ends 2022 with 40,000 downloads from, able to prevent 30 different kinds of semver issues, and having done so in real-world use cases. Inspired by Yoshua Wuyts' "Rust in 2023 (by Yosh)" post, here are my thoughts on cargo-semver-checks in 2022, and what I look forward t… read more

Toward fearless cargo update

August 25, 2022 - 1866 words - 10 mins

I recently built cargo-semver-checks, a linter that ensures crates adhere to semantic versioning. This is why and how I built it.

Fearless development is a key theme throughout Rust. "If it compiles, it works", fearless concurrency, etc.

But there's one aspect of Rust (and nearly all other languages) that isn't entirely fearless yet: cargo update, upgrading the versions of the project's dependencies.

read more