SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Rustの新機能を探る

Rust 2024におけるツールチェインの変更を理解する

Rustの新機能を探る 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Cargoパッケージマネージャ

 Cargoは、Rustのパッケージを管理するツールです。パッケージの作成、ビルド、実行、依存クレートの追加などの機能を備えており、日常の開発において最も利用するツールと言えます。

 Cargoの設定は基本的にパッケージルートにあるCargo.tomlファイルにテーブルやキーを記述することで行います(Cargo自体の設定ファイルや、環境変数による設定もあります)。以降、テーブルやキーという用語が出てきたら、それはCargo.tomlファイルにおけるものと思ってください。

[NOTE]テーブルとキー

 キーとは、Cargo.tomlファイルにおける個々の設定項目です。そしてテーブルとは、それらのキーを役割ごとにまとめるものです。それぞれ、フィールド、セクションなどと置き換えてもよいでしょう。

Rustバージョン対応の依存関係リゾルバ

 Rust 2024では、Rustコンパイラの最小バージョンを考慮した依存関係リゾルバ「resolver = "3"」が既定となりました。

 依存関係リゾルバとは、主にcargo addコマンドでクレートを依存関係に加えるときや、cargo updateコマンドで依存関係にあるクレートを更新するときなどに、対象のクレートのバージョンを決めるために使われます。

 この変更で、Rustコンパイラに互換性のないクレートが依存関係に入ってしまうことを防げるので、ビルドプロセスがより安定することが期待できます。

 「resolver = "3"」とはRust 1.84以降で導入された新しいリゾルバのバージョンで、Rustコンパイラの最小バージョン(MSRV; Minimum Supported rustc Version)を考慮したものです。

 MSRVは、rust-versionキーで指定します。以下のリストは、MSRVを考慮した例です。ただし、Rust 2024ではrustc 1.85がMSRVとなるので、ひとつ前のRust 2021でresolverキーとrust-versionキーを指定した例となっています。

リスト resolver/Cargo.toml
[package]
name = "resolver"
version = "0.1.0"
edition = "2021"	#  エディションは一つ古くする
resolver = "3"		# 依存関係リゾルババージョン3を指定する
rust-version = "1.56"	# rustc 1.56をMSRVとする

 ここで、logクレートを追加してみると、以下のような結果となります。

% cargo add log
    Updating crates.io index
warning: ignoring log@0.4.27 (which requires rustc 1.60.0) to maintain resolver's rust-version of 1.56
      Adding log v0.4.18 to dependencies
…略…
    Updating crates.io index
     Locking 1 package to latest Rust 1.56 compatible version
      Adding log v0.4.18 (available: v0.4.27, requires Rust 1.60.0)

 MSRVに1.56を指定したものの、logクレートの最新バージョン0.4.27にはMSRVに1.60が必要ということで、それは無視して旧バージョン0.4.18が指定されていることがわかります。

 なお、依存関係解決のアルゴリズムには3段階あり、Rustのエディションとともに変化しています。アルゴリズムを指定するのがresolverキーで、その値には既出の"3"を含めて以下の3つの値が指定できます。

  • "1":基本のアルゴリズム。入手可能な最新バージョンを優先
  • "2":エディション2021の既定のアルゴリズム。featuresキーによるフィーチャー(クレートが提供する機能)の指定は各パッケージで統合される
  • "3":エディション2024の既定のアルゴリズム。rust-versionキーに指定したMSRVで依存関係を解決。resolver.incompatible-rust-versionsキーの既定値がallowからfallbackに変更

 resolver.incompatible-rust-versionsキーの既定値の変更で、MSRVに非互換のバージョンに対する動作が変更になります。「resolver = "3"」の位置付けからfallbackはほぼ固定となり、互換性のあるバージョンが優先されるようになりますが、将来的には設定値が加わる可能性があります。

テーブルとキーの名称の一貫性保持

 Rust 2024では、Cargo.tomlにおけるテーブルとキーの名称の重複が解消され、名称が一貫性を持つようになりました。

 Rust 2024では、以下のテーブルとキーが削除され、代替のテーブルおよびキーを使うようになりました。もともとはどちらも使えたのですが、後者に一本化されます。

表 削除されたテーブルとキー
削除 代替
[project] [package]
default_features default-features
crate_type crate-type
proc_macro proc-macro
dev_dependencies dev-dependencies
build_dependencies build-dependencies

 要は、パッケージという名称に一本化し、キー名称の区切り文字をアンダースコア(_)からハイフン(-)に統一したということですね。

[NOTE]cargo fix --editionコマンド

 古いテーブルとキーを含むCargo.tomlファイルは、手作業でも修正できますが、cargo fix --editionコマンドで新しい名称に一括で修正可能です。

% cargo fix --edition 2024

ワークスペース利用時のdefault-featuresキーの取り扱いの変更

 Rust 2024では、ワークスペース利用時のdefault-featuresキーの取り扱いが変更され、ワークスペースの指定のメンバー側での上書きはエラーとなります。

 default-featuresとは、既定のフィーチャーフラグ(主に条件コンパイルに使用する、クレートごとに決められたフラグ)の有効と無効を指定するキーです。

 default-featuresキーの既定値はtrueです。これは既定のフィーチャーフラグを有効にしてビルドするという意味になり、クレートが基本的な機能を提供するようにコンパイルされます。falseを指定した場合は、featuresキーなどで有効にするフィーチャーフラグを明示する必要があります。

 メンバーパッケージがワークグループの依存クレートを継承(workspace = true)する場合、このパッケージに対するdefault-features = falseの指定は、ワークスペースが同様の指定をしない限りビルド時にエラーとなります。

 例えば、以下のリストの構成ではエラーとなります。

リスト workspace/Cargo.toml(ワークスペース)
[workspace]
resolver = "3"
members = ["member"]

[workspace.dependencies]	# 既定でdefault-features = true
regex = "1.10.4"		# regexクレートの1.10.4を使う
リスト workspace/member/Cargo.toml(メンバー)
[package]
name = "member"
version = "0.1.0"
edition = "2024"

[dependencies]
regex = { workspace = true, default-features = false }	# エラーとなる

 これは、メンバー側でdefault-features = falseを指定したが、ワークスペースではdefault-features = true(既定)となっているので、その指定を上書きできないためです。従来は、指定を上書きしても無視されるだけでエラーにはなりませんでしたが、混乱のもとになるため、エラーとするようになったようです。

 ワークスペース側でdefault-features = falseを指定し、メンバー側でdefault-features = trueとするのは問題ありません。

 この場合、他のメンバーでdefault-features = falseと指定されていても、すべてdefault-features = trueと設定されていると見なされます。これは、ワークスペースが単一のバイナリに結合される以上、個別の異なる設定には意味がないからです。

次のページ
RustFmt

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Rustの新機能を探る連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21558 2025/05/27 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング