Rustのパッケージの構成ルールについて公式ドキュメントに記載がありますが、あり得る構成パターンの具体的な作成方法については記載がありません。
そこで今回はタイトルのとおり、単一/複数のクレートを持ったパッケージを作成する方法について試してまとめてみました。
- ひとつのバイナリクレートのみを持つパッケージの作成
- ひとつのライブラリクレートのみを持つパッケージの作成
- 複数のバイナリクレートを持つパッケージの作成
- ひとつのバイナリクレートとひとつのライブラリクレートを持つパッケージの作成
- 複数のバイナリクレートとひとつのライブラリクレートを持つパッケージの作成
パッケージの構成パターン
まずパッケージの構成ルールですが、以下のルールに従う必要があります。
- 少なくとも1つ以上のクレート(バイナリクレートもしくはライブラリクレート)を持つ
- バイナリクレートは複数持つことができる
- ライブラリクレートは最大で1つまで持つことができる
そのためパッケージの構成パターンとしては以下が考えられます。
- ひとつのバイナリクレートのみを持つ
- ひとつのライブラリクレートのみを持つ
- 複数のバイナリクレートを持つ
- ひとつのバイナリクレートとひとつのライブラリクレートを持つ
- 複数のバイナリクレートとひとつのライブラリクレートを持つ
作成方法
それでは実際に考えられるパッケージの構成パターンについてそれぞれ作成してみます。
ひとつのバイナリクレートのみを持つパッケージ
ひとつのバイナリクレートのみを持つパッケージを作成する場合は簡単です。
下記のコマンドを実行すればバイナリクレートをひとつ含んだパッケージが作成できます。
cargo new sample出来上がったパッケージの構造は以下のようになります。
sample/
|-- Cargo.toml
`-- src/
`-- main.rsひとつのライブラリクレートのみを持つパッケージ
続いてひとつのライブラリクレートのみを持つ場合です。
こちらも前述のバイナリクレートと同様にコマンドを実行するだけでOKです。
cargo new sample --lib出来上がったパッケージの構造は以下のようになります。
sample/
|-- Cargo.toml
`-- src/
`-- lib.rs複数のバイナリクレートを持つパッケージ
複数のバイナリクレートを持つパッケージを作成する場合です。
現時点(2023年06月時点)ではこれを行うためのコマンドは存在しないようです。
そのため下記の手順で作成します。
ひとまず下記のコマンドでパッケージの大枠を作成します。
cargo new sample出来上がったものは以下のような構造になっているはずです。
sample/
|-- Cargo.toml
`-- src/
`-- main.rs以下のようにファイル/フォルダ構成を変更します。
sample/
|-- Cargo.toml
`-- src/
`-- bin/
|-- bar.rs
`-- foo.rsこれで複数のバイナリをもったパッケージの完成です。
複数のバイナリクレートを持つパッケージでcargo runを実行する場合は以下のようにして動かしたいバイナリを指定する必要があります。
cargo run --bin barひとつのバイナリクレートとひとつのライブラリクレートのパッケージ
バイナリクレートひとつ、ライブラリクレートひとつの場合です。
こちらもコマンドで作成する方法はないようです。
そのため複数のバイナリクレートを持つパッケージと同様に以下の手順で作成します。
下記のコマンドでパッケージの大枠を作成します。
cargo new sample出来上がったものは以下のような構造になっているはずです。
sample/
|-- Cargo.toml
`-- src/
`-- main.rs以下のようにファイル/フォルダ構成を変更します。
sample/
|-- Cargo.toml
`-- src/
|-- lib.rs
`-- main.rsこれでバイナリクレートとライブラリクレートをひとつずつ持ったパッケージの完成です。
複数のバイナリクレートとひとつのライブラリクレートのパッケージ
複数のバイナリクレート、ひとつのライブラリクレートの場合です。
こちらもコマンドで作成する方法はないようです。
そのため複数のバイナリクレートを持つパッケージと同様に以下の手順で作成します。
下記のコマンドでパッケージの大枠を作成します。
cargo new sample出来上がったものは以下のような構造になっているはずです。
sample/
|-- Cargo.toml
`-- src/
`-- main.rs以下のようにファイル/フォルダ構成を変更します。
sample/
|-- Cargo.toml
`-- src/
|-- bin/
| |-- bar.rs
| `-- foo.rs
`-- lib.rsこれでバイナリクレートを複数、ライブラリクレートをひとつ持ったパッケージの出来上がりです。
最後に
いろいろなパターンのパッケージの作り方がふと気になったので調べてみました。
複数のクレートを持つパッケージがどれほど有用かはわかりませんが、Rustを理解するためにもとりあえず試してみるのは大事だなと改めて感じます。



