依存関係
ほとんどのプログラムはライブラリに依存関係を持ちます。もし依存関係を手動で管理したことがあれば、それがどれだけ苦痛であるか分かるでしょう。幸運なことに、Rustのエコシステムにはcargo
が標準装備されています!cargo
によってプロジェクトの依存関係を管理することができます。
Rustのプロジェクトを新しく作るには下記のようにします。
# A binary
# バイナリ
cargo new foo
# A library
# ライブラリ
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" # from crates.io
# crates.ioから
rand = { git = "https://github.com/rust-lang-nursery/rand" } # from online repo
# オンラインのレポジトリから
bar = { path = "../bar" } # from a path in the local filesystem
# ローカルのファイルシステムのパスから
cargo
は依存管理ツール以上のこともできます。Cargo.toml
のformat specificationに全ての設定オプションがリストアップされています。
プロジェクトをビルドするには、プロジェクトディレクトリのどこか(サブディレクトでも!)でcargo build
を実行します。またcargo run
でビルドと実行をできます。これらのコマンドは、全ての依存関係の解決、必要なクレートのダウンロード、自分のクレートを含む全てのビルドを行うことに注意してください。(make
と同様、まだビルドしていないものだけをビルドします。)
Voila!これで完成です!