Rustプロジェクトで「このクレートは Rust 1.70 以上が必要」と明示したいとき、Cargo.tomlrust-version フィールドが役立ちます。MSRV(Minimum Supported Rust Version)をマニフェストに記録しておくと、ビルド時のバージョン不整合をエラーとして即座に検出でき、依存解決の自動化にもつながります。

rust-version フィールドの役割

rust-versionCargo.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 updatecargo add が依存クレートを選ぶ際、プロジェクトの rust-version と互換性があるバージョンを優先的に採用します。

有効化の方法

2つの方法があります。

方法1: .cargo/config.toml で設定

[resolver]
incompatible-rust-versions = "fallback"

既存の MSRV をそのまま維持しながら、リゾルバーの挙動だけ変更できます。

方法2: Cargo.tomlresolver = "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 verifyCargo.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 の違い

editionrust-version はどちらも Rust のバージョンに関わるフィールドですが、目的が異なります。

項目editionrust-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 を後から追加する手順

  1. cargo msrv find で実際の MSRV を検出
  2. Cargo.tomlrust-version を追記
  3. cargo msrv verify で検証
  4. CI に MSRV チェック用のジョブを追加

まとめ

rust-version フィールドは、Rust プロジェクトのバージョン互換性を管理するうえで中心的な役割を果たします。

  • Cargo.tomlrust-version = "1.XX" を宣言するだけで、非互換なツールチェーンでのビルドを自動検出できます
  • Rust 1.84 以降の MSRV 対応リゾルバーにより、依存解決でも MSRV が考慮されるようになりました
  • cargo-msrv ツールで実際の最小互換バージョンを検出し、CI で継続的に検証する運用が効果的です
  • MSRV の引き上げは Cargo の SemVer ガイドラインでマイナーバージョンとして扱うことが推奨されており、クレートのバージョン番号に反映させる運用が望ましいです