Versioning

Every release carries a version in Package.Version. Rux uses strict Semantic Versioning 2.0.0, without a leading v.

[Package]
Version = "1.2.3"

What the numbers mean

MAJOR.MINOR.PATCH, incremented by the kind of change you made:

PartIncrement when
MAJORYou made an incompatible change to your public API
MINORYou added functionality that existing code keeps working with
PATCHYou fixed something without changing the API

Below 1.0.0 the leading zero absorbs the meaning: a 0.x release may break compatibility on a minor bump, which is why ^0.2.3 only allows <0.3.0. See version requirements.

Prereleases

A prerelease suffix marks a version as not yet ready:

Version = "2.0.0-alpha.1"

Prereleases sort before their release — 2.0.0-alpha.1 precedes 2.0.0 — and are never selected by an ordinary requirement. A resolver picks one only when a comparator names the same major.minor.patch and carries a prerelease of its own, so ^1.0.0 will never quietly upgrade you to 2.0.0-beta.1.

Build metadata

A + suffix carries build metadata:

Version = "1.0.0+linux"

Metadata is ignored when ordering versions but is part of publication identity. 1.0.0+linux and 1.0.0+windows are two distinct releases that compare as equal for requirement matching. Most packages never need this; reach for it only when one logical version genuinely ships as several artifacts.

Immutability

A published version can never be replaced. Publishing a version that already exists is rejected:

error: version 1.0.0 of Acme/Widget is already published; published versions are
immutable, so publish a new version

Immutability is what makes a build reproducible: a dependency resolved today resolves to the same bytes next year. It also means a mistake ships. If you published something broken, publish a fixed patch release and yank the bad one — there is no way to overwrite or delete it.

Because build metadata is part of identity, 1.0.0+fix counts as a different version from 1.0.0 and will be accepted. Do not use that as a substitute for a patch bump: resolvers treat the two as equal precedence, so which one a build selects is not something you control.

Choosing MinRux

Manifest.MinRux is the oldest compiler release that can build your package, and it is required to publish. Set it to the earliest version you have actually tested against, not to whatever you happen to have installed — a compiler older than the declared minimum refuses to build the package at all.

Raising MinRux in a new release is a compatibility change for anyone on an older toolchain, so treat it like any other breaking change when choosing the version number.