Cargoパッケージマネージャ

Cargo [The Cargo Book] はRustに付属するパッケージマネージャです。CargoパッケージマネージャはCargoパッケージと呼ばれる単位で依存関係解決、バージョン管理、およびビルドを行います。Rustで書かれたライブラリ (標準ライブラリ含む) はCargoパッケージで表されますが、ライブラリの最終消費者であるアプリケーションや外部コードとリンク可能なスタティックライブラリ等も特別な設定をしたCargoパッケージとして表されます。

../../_images/cargo-deps.svg

SOLID-Rustの「Rustプロジェクト」は1つの主要なCargoパッケージを持ち、これをCargoを使用してビルドすることでスタティックライブラリを出力します。依存パッケージのダウンロードやビルドはCargoが必要に応じて自動的に行います。

Note

SOLID-Rustにおける複数Cargoパッケージから構成されるアプリケーションの扱い方については検討中です。

Cargoパッケージの定義は Cargo.toml というTOML形式のファイルで行います [The Cargo Book] 。以下に例を示します。

# パッケージ全般の設定項目。
[package]

# パッケージ名
name = "rust_lib1"

# パッケージバージョンを指定します。SOLID-Rustプロジェクトのようなパッケージ最終消費者に対しては
# あまり意味はありません。
version = "0.1.0"

# パッケージが使用するRustのエディションを指定します。エディションはRust言語に対して破壊的な変更
# (例えば、非推奨構文の削除) を導入するために使用されます。現時点で存在するエディションは2015,
# 2018, 2021です。
edition = "2021"

# このセクションで依存パッケージを指定します。
[dependencies]

[lib]
# SOLID-Rustプロジェクトでは外部コードとリンクするためのスタティックライブラリを
# 生成したいため、 "staticlib" を指定します。
crate-type = ["staticlib"]

crates.io

crates.ioはCargoパッケージマネージャがデフォルトで使用するパッケージレジストリです。Rustの多くのオープンソースライブラリはここで公開されています。ここで公開されているライブラリは Cargo.toml に簡単な記述 [The Cargo Book] を追加するだけで使用できます。

[dependencies]
log = "0.4"
env_logger = { version = "0.8.3", default-features = false }
hyper = "0.14"
itron = { version = "0.1.7", features = ["solid_asp3", "dcre"] }

Rustの標準ライブラリは後方互換性がきわめて重要であることから機能が最小限に絞られています。このため、簡単なプログラムでもcrates.io由来のパッケージを使用することは一般的なプラクティスです。

代表的なパッケージの例については Cargoパッケージの例 をご覧下さい。

crates.ioで提供されているライブラリをプロジェクトに追加する手順についてはチュートリアル crates.ioからパッケージを追加する をご覧下さい。

crates.io外のパッケージを利用する

Cargoはcrates.io以外の場所にあるパッケージを利用する方法をいくつか提供しています。ここではその一部を説明します。

git 属性で指定した依存パッケージはGitレポジトリから取得されます [The Cargo Book]

[dependencies]
regex = { git = "https://github.com/rust-lang/regex" }

path 属性で指定した依存パッケージはローカルファイルシステム上の別のディレクトリから取得されます [The Cargo Book]

[dependencies]
app_utils = { path = "../app_utils" }

crates.ioに接続できない状況でビルドできるようにするためにcrates.ioのパッケージをローカルにコピーして使用する方法があります (vendoringと呼びます)。cargo vendor コマンドについてはCargoの公式ドキュメント The Cargo Book を参照してください。

SOLIDサポートパッケージ

上で述べたようにRust標準ライブラリは後方互換性を重要視しているため、プラットフォームによる差が大きいコンセプトを対象とした抽象化APIは外部パッケージに委ねています。最もよく使用されている外部パッケージの例としてcrates.ioの12%のパッケージが直接的または間接的に依存している getrandom (エントロピー源API) があります。

こうしたパッケージをSOLIDターゲットで使用するためにはSOLIDターゲットに対応したフォーク版が必要となります。フォーク版のパッケージは solid-rs GitHub organization でGitレポジトリの形でホストされています。

注釈

これらのパッケージは出典と同等のライセンスで提供されています。随時更新しており、コントリビューションも歓迎しますが、動作保証はいたしかねます。

これらのパッケージの大部分はcrates.ioにパブリッシュされていませんが、Cargoのパッチ機能を利用することでGitレポジトリから直接パッケージを追加し、標準版のパッケージを置き換えることができます。手元のパッケージの Cargo.toml ファイルに以下の記述を追加してください。

[patch.crates-io]
chrono = { git = "https://github.com/solid-rs/chrono.git", branch = "solid-rs/0.4.x" }
hyper = { git = "https://github.com/solid-rs/hyper.git", branch = "solid-rs/0.14.x" }
mio = { git = "https://github.com/solid-rs/mio.git", branch = "solid-rs/0.8.x" }
ring = { git = "https://github.com/solid-rs/ring.git", branch = "solid-rs/0.16.x" }
socket2 = { git = "https://github.com/solid-rs/socket2.git", branch = "solid-rs/0.4.x" }
time1 = { package = "time", git = "https://github.com/solid-rs/time.git", branch = "solid-rs/0.1.x" }
tokio = { git = "https://github.com/solid-rs/tokio.git", branch = "solid-rs/1.x" }