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キーを指定した例となっています。
[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] resolver = "3" members = ["member"] [workspace.dependencies] # 既定でdefault-features = true regex = "1.10.4" # regexクレートの1.10.4を使う
[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と設定されていると見なされます。これは、ワークスペースが単一のバイナリに結合される以上、個別の異なる設定には意味がないからです。