依存関係
ほとんどのプログラムは何らかのライブラリに依存しています。依存関係を手作業で管理したことがあれば、それがどれほど面倒かご存じでしょう。幸いなことに、Rust エコシステムには標準で cargo が備わっています!cargo はプロジェクトの依存関係を管理できます。
新しい Rust プロジェクトを作成するには、次のようにします。
# バイナリ
cargo new foo
# ライブラリ
cargo new --lib bar
この章の残りでは、ライブラリではなくバイナリを作っていると仮定しますが、概念はすべて同じです。
上記のコマンドを実行すると、次のようなファイル階層が表示されるはずです。
.
├── bar
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── foo
├── Cargo.toml
└── src
└── main.rs
main.rs は新しい foo プロジェクトのルートソースファイルです。ここに新しい点はありません。 Cargo.toml は、このプロジェクトにおける cargo の設定ファイルです。中を見ると、次のような内容が表示されるはずです。
[package]
name = "foo"
version = "0.1.0"
authors = ["mark"]
[dependencies]
[package] の下にある name フィールドは、プロジェクトの名前を決定します。これはクレートを公開する場合に crates.io で使用されます(詳しくは後述します)。また、コンパイル時の出力バイナリの名前にもなります。
version フィールドは、セマンティックバージョニングを使用したクレートのバージョン番号です。
authors フィールドは、クレートを公開するときに使用される作者の一覧です。
[dependencies] セクションでは、プロジェクトの依存関係を追加できます。
たとえば、プログラムに優れた CLI を持たせたいとします。crates.io(公式の Rust パッケージレジストリ)には、優れたパッケージがたくさんあります。人気のある選択肢の 1 つが clap です。本稿執筆時点で、公開されている clap の最新バージョンは 2.27.1 です。プログラムに依存関係を追加するには、Cargo.toml の [dependencies] の下に次を追加するだけです: clap = "2.27.1"。これで完了です!プログラム内で clap を使い始めることができます。
cargo は他の種類の依存関係もサポートしています。ここでは、そのごく一部を紹介します。
[package]
name = "foo"
version = "0.1.0"
authors = ["mark"]
[dependencies]
clap = "2.27.1" # crates.io から
rand = { git = "https://github.com/rust-lang-nursery/rand" } # オンラインリポジトリから
bar = { path = "../bar" } # ローカルファイルシステム内のパスから
cargo は単なる依存関係マネージャーではありません。利用可能なすべての設定オプションは、Cargo.toml のフォーマット仕様に記載されています。
プロジェクトをビルドするには、プロジェクトディレクトリ内の任意の場所(サブディレクトリを含みます!)で cargo build を実行できます。cargo run を実行して、ビルドして実行することもできます。これらのコマンドはすべての依存関係を解決し、必要に応じてクレートをダウンロードし、自分のクレートを含めてすべてをビルドすることに注意してください。(make と同様に、まだビルドされていないものだけを再ビルドすることにも注意してください)。
できました!必要なことはこれだけです!