"構造は技術的な選択であり、文化はその技術の使い方を決める。"
Rustのプロジェクトを触ると、誰もが遭遇するのが「crate」と「package」という二つの概念だ。
表層的には似て見えるこの二つは、構文的な違い以上に、“設計の単位”と“配布の単位”という役割の差を持っている。
そして、それは単なる技術的構造ではない。
**Rustという言語がコミュニティと共に育んだ「構造的信頼文化」**の現れでもある。
この章では、crateとpackageの違いと役割、そしてその背景にあるRust特有の文化的設計思想を深掘りしていく。
crateとは「コンパイル単位」である
Rustにおいて、crateとは1つのコンパイル単位である。
例えば次のような構成があった場合:
src/
└── lib.rs
このプロジェクトのcrate名は、デフォルトでCargo.tomlの [package] name = "your_project"
に由来する。
そして lib.rs
がこのcrateのエントリポイントになる。
- crateは1つのバイナリ/ライブラリとしてコンパイルされる
- crateは明示的に外部に公開するインターフェースを持つ(
pub
)
つまり、crateとは**「この単位で他者に意味のある機能を提供する」という構造的表明**なのだ。
packageとは「配布単位」である
一方で、Cargo.tomlが定義するのは package。
これは**crateをひとつ以上含む“プロジェクト全体”**であり、Cargoによってビルド・テスト・公開される単位でもある。
[package]
name = "myapp"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = "1.0"
- packageは1つのCargo.tomlで管理されるもの
- 複数のcrate(例:
lib.rs
,main.rs
,bin/foo.rs
など)を内包できる - crates.ioへの公開、依存解決、バージョン管理の最小単位
つまり、**packageはプロジェクトの“社会的な顔”であり、crateはその“構造的な体”**である。
クレートは“設計された意味の粒度”である
良いcrate設計とは、次のようなものだ:
- 明確な責務(小さすぎず、大きすぎず)
- 公開APIが少数精鋭で整備されている
-
mod
によって適切に名前空間が整理されている -
lib.rs
によってcrateのドメイン的エントリポイントが定義されている
これはまさに、**機能的かつ文化的に洗練された“構造体”**である。
クレート境界は、構文で強制される“信頼の壁”
Rustでは、別crateの関数や型にアクセスするには、明示的に pub
で公開されていなければならない。
これは「意図しない依存や侵入をコンパイラが拒絶する」ことを意味する。
つまり、crate境界とは:
- 意図を越えた使用を防ぐ構文的防壁
- 意図をもって設計されたAPIだけが見える構造的レイヤ
- 設計の独立性を支える分離機構
設計者は「どこまでをcrateに閉じ込めるか」「どこからを開くか」を構文によって定義できる。
package文化:Cargoによる構造と信頼の共有
Rustが世界的に成功した理由の一つが、Cargoの存在だ。
-
cargo new
による標準構成の強制 -
cargo build
,cargo test
,cargo doc
,cargo publish
による一貫運用 - crates.ioというグローバルな共有の場を持つ
つまり、Rustのpackageは設計された構造を、設計された方法で、設計された場所に流通させる文化的仕組みなのである。
“1つのcrateに1つの責務”という思想
Rustでは、「細かく分離し、それぞれが責任を持つcrateを設計する」ことが推奨される。
-
serde
→ シリアライズの責任を持つ -
regex
→ 正規表現処理の責任を持つ -
clap
→ コマンドライン引数解析の責任を持つ
これは、設計責務に忠実なcrate群によって構築される、分散された信頼ネットワークである。
その上で構成されるpackageは、構造と文化の集約点として機能する。
結語:crateとpackageは「構造」と「社会性」の結節点である
Rustにおけるcrateとpackageは、ただの技術的単位ではない。
それは、構文による設計の粒度と、文化的流通の責任を分離・管理する設計装置である。
- crate:設計の粒度(設計者の視野)
- package:流通と共有の粒度(社会との接続点)
構造は構文で定義される。
だが、その構文が文化と結びついたとき、それは**言語を越えた“設計の信用体系”**になる。
"crateは構造の単位であり、packageは信頼の単位である。Rustはその境界を、設計者に問う構文を持っている。"