// dictionary
パッケージ.
パッケージは、1つ以上のクレート(コンパイルの単位)をまとめた、Cargoが扱うビルド・配布の単位です。ルートには必ずCargo.toml(マニフェスト)が置かれ、パッケージ名・バージョン・依存関係といったパッケージ全体の設定が記述されます1。cargo newが作るのもパッケージで、Rustのプロジェクトを扱う基本単位になります。
1つのパッケージに入れられるライブラリクレートは最大1つですが、バイナリクレートは何個でも入れられます(クレートは少なくとも1つ必要です)1。両方を持つ構成にすると、ロジックをライブラリクレート側にまとめ、バイナリクレートからはパッケージ名で呼び出せます。
/// カートの合計金額を税込(10%)で計算する
pub fn total_price(prices: &[u32]) -> u32 {
prices.iter().sum::<u32>() * 110 / 100
}// ライブラリクレートはパッケージ名で参照する(Playgroundではパッケージ名が playground 固定)
use playground::total_price;
fn main() {
let cart = [980, 1250, 300]; // カートに入れた商品の価格
println!("合計金額: {}円", total_price(&cart));
}パッケージの構成
どのファイルがどのクレートになるかは、Cargoの規約(ファイルの配置)で決まります1。Cargo.tomlはどのクレートにも属さず、src/と同じ階層(パッケージのルート)に置きます。
| ファイル | なるクレート | 個数 |
|---|---|---|
src/lib.rs |
ライブラリクレート | 最大1つ |
src/main.rs |
バイナリクレート(クレート名はパッケージ名) | 最大1つ |
src/bin/直下のファイル |
バイナリクレート | 何個でも |
補足
cargo newが生成するもの
cargo new shoppingを実行すると、Cargo.tomlとsrc/main.rsだけを持つバイナリのパッケージが作られ、同時にgitリポジトリも初期化されます(すでにVCSの管理下にある場合は初期化しません)。--libを付けるとsrc/lib.rsを持つライブラリのパッケージになります2。
[package]
name = "shopping"
version = "0.1.0"
edition = "2024"
[dependencies]editionの既定値は2024です(Rust 1.93で確認)2。外部パッケージを使うときは[dependencies]への追記が必要ですが、標準ライブラリは追記なしで使えます。
パッケージ名とクレート名がずれることがある
パッケージ名にはハイフンを使えますが、ライブラリクレートの名前は既定で「パッケージ名のハイフンをアンダースコアに置き換えたもの」になります1。そのためshopping-cartパッケージのライブラリは、コード上ではuse shopping_cart::...と書きます。
複数のパッケージをまとめるワークスペース
パッケージが増えてきたら、複数のパッケージを一緒に管理する「ワークスペース」を作れます。ワークスペースのメンバーは共通のCargo.lockと出力先のtargetディレクトリを共有します3。パッケージの外側にもう一段階の単位があるため、パッケージが管理の最大単位とは限りません。
Footnotes
この辞書が使われているページ
backlinks 3