Rustプロジェクトで「このクレートは Rust 1.70 以上が必要」と明示したいとき、Cargo.toml の rust-version フィールドが役立ちます。MSRV(Minimum Supported Rust Version)をマニフェストに記録しておくと、ビルド時のバージョン不整合をエラーとして即座に検出でき、依存解決の自動化にもつながります。
rust-version フィールドの役割
rust-version は Cargo.toml の [package] セクションに記述するオプション項目です。パッケージが動作保証する最も古い Rust のバージョンを宣言します。
[package]
name = "my-app"
version = "0.1.0"
edition = "2021"
rust-version = "1.70"
Rust 1.56 で導入され、RFC 2495 で仕様が策定されました(出典: RFC 2495)。
記述の制約
| ルール | 具体例 |
|---|---|
| 数値コンポーネント1つ以上 | "1.70" や "1.70.0" はOK |
| semver 演算子は使用不可 | ">=1.70" や "^1.70" はNG |
| pre-release 識別子は無視 | nightly でもバージョン番号部分で比較される |
設定しなかった場合
rust-version を省略するとバージョンチェックは行われず、ユーザーの手元で予期しないコンパイルエラーが発生する可能性があります。特にライブラリクレートを公開する場合、指定しておくとユーザー体験が向上します。
MSRV の確認方法
現在のツールチェーンバージョンと、プロジェクトが要求する MSRV の確認にはいくつかの手段があります。
rustc のバージョン確認
rustc --version
# 出力例: rustc 1.93.1 (eaef74711 2026-02-05)
2026年2月時点の最新安定版は Rust 1.93.1 です(出典: releases.rs)。
Cargo.toml から読み取る
cargo metadata --format-version 1 | jq '.packages[0].rust_version'
# 出力例: "1.70"
cargo metadata を使えば JSON 形式でパッケージ情報を取得でき、スクリプトからの参照にも適しています。
cargo-msrv で自動検出する
プロジェクトの実際の MSRV を自動的に特定するには cargo-msrv が便利です。
# インストール
cargo install cargo-msrv
# 最小互換バージョンを探索(デフォルトは二分探索)
cargo msrv find
# 線形探索で確認する場合
cargo msrv find --linear
# 現在設定されている MSRV を表示
cargo msrv show
# 実際のビルドが通るか検証
cargo msrv verify
cargo msrv find はバイナリサーチで各ツールチェーンを順に試し、ビルドが通る最も古いバージョンを報告します。結果を Cargo.toml へ反映すれば、宣言と実態の乖離を防げます。
MSRV 対応リゾルバー(Rust 1.84 以降)
Rust 1.84.0 で MSRV 対応リゾルバー が安定化しました(出典: Rust 1.84.0 リリースノート)。これにより cargo update や cargo add が依存クレートを選ぶ際、プロジェクトの rust-version と互換性があるバージョンを優先的に採用します。
有効化の方法
2つの方法があります。
方法1: .cargo/config.toml で設定
[resolver]
incompatible-rust-versions = "fallback"
既存の MSRV をそのまま維持しながら、リゾルバーの挙動だけ変更できます。
方法2: Cargo.toml で resolver = "3" を指定
[package]
resolver = "3"
ただし resolver 3 は Rust 1.84 以降でしか利用できないため、MSRV を 1.84 未満に設定しているプロジェクトでは方法1 が適しています。
2024 エディションとの関係
Rust 1.85(2025年2月リリース)で安定化した Edition 2024 を採用すると、リゾルバー 3 がデフォルトで有効になります。新規プロジェクトで edition = "2024" を選べば追加設定は不要です。
従来との挙動比較
| 状況 | リゾルバー 2 以前 | リゾルバー 3 |
|---|---|---|
| 依存の最新版が MSRV 非互換 | 最新版を取得しビルドエラー | MSRV 互換の旧版へ自動フォールバック |
cargo add 実行時 | 最新版を追加 | MSRV 互換版を追加し、最新版でない場合は通知 |
cargo update 実行時 | 最新版へ更新 | MSRV 互換の範囲で最新版へ更新 |
CI で MSRV を検証する
MSRV を宣言するだけでなく、継続的に検証する仕組みが重要です。GitHub Actions の例を示します。
name: MSRV Check
on: [push, pull_request]
jobs:
msrv:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.70.0" # rust-version と同じ値を指定
- run: cargo check --all-features
ポイント
rust-versionに記載した値と同じツールチェーンを CI にインストールするcargo checkで構文・型チェックのみ実行するとビルド時間を短縮できる--all-featuresを付けるとフィーチャーフラグで有効になるコードパスも検証対象にできる
cargo-msrv との組み合わせ
- name: Install cargo-msrv
run: cargo install cargo-msrv
- name: Verify MSRV
run: cargo msrv verify
cargo msrv verify は Cargo.toml に記載された MSRV でビルドが通るかを検証し、乖離があれば非ゼロの終了コードを返します。
rust-version の更新戦略
MSRV をどのタイミングで引き上げるかはプロジェクトのポリシーに依存します。代表的な戦略を整理します。
N-2 ポリシー
最新安定版から 2 リリース分の猶予を設ける運用です。Rust は6週間ごとにリリースされるため(出典: Arch Linux Wiki)、約12週間(3か月弱)の猶予期間になります。
例: 最新が 1.93 の場合 → rust-version = "1.91"
セマンティックバージョニングとの関係
Cargo の SemVer リファレンスでは、rust-version の引き上げは 破壊的変更の可能性がある変更(Possibly-breaking) に分類されつつ、マイナーバージョンとして扱うことが推奨 されています(出典: SemVer Compatibility - The Cargo Book)。つまり、rust-version を "1.70" から "1.75" へ変更する際は、クレートのバージョンをパッチではなくマイナー以上で上げることが推奨されます。
# Before: version = "0.5.3", rust-version = "1.70"
# After: version = "0.6.0", rust-version = "1.75"
ワークスペースでの MSRV 管理
ワークスペース内で複数のクレートが異なる MSRV を持つ場合は、各クレートの Cargo.toml に個別の rust-version を設定します。
# crates/core/Cargo.toml
[package]
rust-version = "1.65"
# crates/cli/Cargo.toml
[package]
rust-version = "1.75"
リゾルバーはワークスペース全体ではなく各パッケージの rust-version を参照するため、コアライブラリは広い互換性を維持しつつ CLI ツールは新しい機能を活用する、という運用が可能です。
#[cfg(version(..))] 属性との関連
RFC 2523 で提案された #[cfg(version(..))] は、コンパイラのバージョンに応じてコードを条件分岐させる仕組みです(出典: RFC 2523)。2025年に安定化の PR が提出されましたが、条件名の選定(version(...) か rust_version(...) か)を含む設計上の議論が続いており、2026年2月時点ではまだ安定化されていません(出典: Tracking Issue #64796)。
// nightly で試用可能な構文
#![feature(cfg_version)]
#[cfg(version("1.80"))]
fn use_new_api() {
// Rust 1.80 以降でのみコンパイルされる
}
#[cfg(not(version("1.80")))]
fn use_new_api() {
// Rust 1.79 以前向けのフォールバック
}
安定化されると、単一のクレートで複数の Rust バージョンに対応するコードを書けるようになります。現時点では nightly の #![feature(cfg_version)] で試用可能です。
edition と rust-version の違い
edition と rust-version はどちらも Rust のバージョンに関わるフィールドですが、目的が異なります。
| 項目 | edition | rust-version |
|---|---|---|
| 目的 | 言語構文の切り替え | 最低動作バージョンの宣言 |
| 値の例 | "2021", "2024" | "1.70", "1.85" |
| 変更時の影響 | コード修正が必要な場合あり | ビルド互換性のみ |
| 必須かどうか | 省略時はデフォルト値 | 任意(推奨) |
edition = "2021" はエディション 2021 の構文を使うことを意味しますが、ビルドに必要な最低バージョンは別途 rust-version で指定します。たとえば edition = "2021" は Rust 1.56 以降で利用できますが、実際のコードが 1.56 で動作するとは限りません。rust-version = "1.65" のように実際の動作確認に基づいた値を設定するのが正確です。
トラブルシューティング
「package requires Rust version X」エラー
error: package `my-crate v0.1.0` cannot be built because it requires
rustc 1.75.0 or newer, while the currently active rustc version is 1.70.0
このエラーは、使用中のツールチェーンがプロジェクトの rust-version を満たしていないときに表示されます。
対処法:
# ツールチェーンを更新する
rustup update stable
# 特定バージョンをインストールする
rustup install 1.75.0
# MSRV チェックを一時的にスキップする
cargo build --ignore-rust-version
依存クレートの MSRV 不整合
依存クレートの rust-version が自プロジェクトより新しい場合もエラーになります。MSRV 対応リゾルバーを有効化していれば自動フォールバックされますが、無効の場合は手動で互換バージョンを指定します。
# 特定バージョンを固定する
cargo update -p some-crate --precise 0.3.5
rust-version を後から追加する手順
cargo msrv findで実際の MSRV を検出Cargo.tomlにrust-versionを追記cargo msrv verifyで検証- CI に MSRV チェック用のジョブを追加
まとめ
rust-version フィールドは、Rust プロジェクトのバージョン互換性を管理するうえで中心的な役割を果たします。
Cargo.tomlにrust-version = "1.XX"を宣言するだけで、非互換なツールチェーンでのビルドを自動検出できます- Rust 1.84 以降の MSRV 対応リゾルバーにより、依存解決でも MSRV が考慮されるようになりました
cargo-msrvツールで実際の最小互換バージョンを検出し、CI で継続的に検証する運用が効果的です- MSRV の引き上げは Cargo の SemVer ガイドラインでマイナーバージョンとして扱うことが推奨されており、クレートのバージョン番号に反映させる運用が望ましいです
