依存

ほとんどのプログラムはライブラリへの依存を持ちます。もし手動で依存を管理したことがないなら、 その苦痛はわからないでしょう。幸運なことに、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.rsextern 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のように、まだビルド されていないもののみビルドします。)

たったこれだけです!