依存
ほとんどのプログラムはライブラリへの依存を持ちます。もし手動で依存を管理したことがないなら、
その苦痛はわからないでしょう。幸運なことに、Rustのエコシステムはcargoで標準化されています!
cargoでプロジェクトの依存を管理できます。
新しいRustプロジェクトを作る:
# バイナリ
cargo new foo
# ライブラリ
cargo new --lib foo
この章では、バイナリを作ることを想定しています。しかし、コンセプト はすべて同じです。
上のコマンドを入力すると、次のようなファイル階層になるでしょう:
foo
├── Cargo.toml
└── src
└── main.rs
main.rsはソースファイルの根幹です。何も新しいことはありません。
Cargo.tomlはこのプロジェクト(foo)用のcargo設定ファイルです。
中身はこのようになっているでしょう:
[package]
name = "foo"
version = "0.1.0"
authors = ["mark"]
[dependencies]
[package]下のnameフィールドはプロジェクト名です。これはクレートを
crates.ioに公開するときに使われます。(詳しくは後で) これはコンパイルされた
バイナリの名前にもなります。
versionフィールドはセマンティックバージョニング
をベースとしたバージョン番号です。
authorsフィールドはクレートを公開するときの開発者のリストです。
[dependencies]節にプロジェクトの依存を記述します。
例えば、素晴らしいCLIツールを作りたいときは、crates.io (Rust
の公式パッケージレジストリ)にたくさんの素晴らしいクレートがあります。ポピュラーなものでは
clapなどが良いでしょう。
これを書いている時点で、clapの最新版は2.27.1です。 プログラムに依存を追加するには、
Cargo.tomlの[dependencies]節に、clap = "2.27.1"という行を加え、もちろんmain.rsに
extern crate clapを加える必要がありますが、それだけで良いです! 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のすべての
設定オプションの一覧ははformat specificationにあります。
プロジェクトを実行ファイルにビルドするにはcargo buildをプロジェクトディレクトリ内の
いずれかのディレクトリ(サブディレクトリでもOKです!)から実行してください。また、
cargo runでビルド後に実行できます。これらのコマンドは、依存関係を解決し、
必要に応じてクレートをダウンロードし、すべてをビルドします。(makeのように、まだビルド
されていないもののみビルドします。)
たったこれだけです!