Progrust Library.

// dictionary

パッケージ.

パッケージは、1つ以上のクレート(コンパイルの単位)をまとめた、Cargoが扱うビルド・配布の単位です。ルートには必ずCargo.toml(マニフェスト)が置かれ、パッケージ名・バージョン・依存関係といったパッケージ全体の設定が記述されます1cargo newが作るのもパッケージで、Rustのプロジェクトを扱う基本単位になります。

1つのパッケージに入れられるライブラリクレートは最大1つですが、バイナリクレートは何個でも入れられます(クレートは少なくとも1つ必要です)1。両方を持つ構成にすると、ロジックをライブラリクレート側にまとめ、バイナリクレートからはパッケージ名で呼び出せます。

// project

ライブラリとバイナリを持つパッケージ

2 files

Playgroundで開く
src/
lib.rs
main.rs
src/lib.rs
/// カートの合計金額を税込(10%)で計算する
pub fn total_price(prices: &[u32]) -> u32 {
    prices.iter().sum::<u32>() * 110 / 100
}
src/main.rs
// ライブラリクレートはパッケージ名で参照する(Playgroundではパッケージ名が playground 固定)
use playground::total_price;

fn main() {
    let cart = [980, 1250, 300]; // カートに入れた商品の価格
    println!("合計金額: {}円", total_price(&cart));
}

パッケージの構成

どのファイルがどのクレートになるかは、Cargoの規約(ファイルの配置)で決まります1Cargo.tomlはどのクレートにも属さず、src/と同じ階層(パッケージのルート)に置きます。

ファイル なるクレート 個数
src/lib.rs ライブラリクレート 最大1つ
src/main.rs バイナリクレート(クレート名はパッケージ名) 最大1つ
src/bin/直下のファイル バイナリクレート 何個でも

補足

cargo newが生成するもの

cargo new shoppingを実行すると、Cargo.tomlsrc/main.rsだけを持つバイナリのパッケージが作られ、同時にgitリポジトリも初期化されます(すでにVCSの管理下にある場合は初期化しません)。--libを付けるとsrc/lib.rsを持つライブラリのパッケージになります2

Cargo.toml
[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

  1. Glossary(Package) — The Cargo BookPackages and Crates — The Rust Programming LanguageCargo Targets — The Cargo Book 2 3 4

  2. cargo new — The Cargo Book 2

  3. Workspaces — The Cargo Book

この辞書が使われているページ

backlinks 3

  1. 辞書クレート
  2. 辞書外部パッケージ
  3. 動かして学ぶRustプログラミング問題集 › 第15章 ファイル分割とクレート