cargo add
でパッケージを追加しよう
Cargoの役割の一つに依存関係の管理があります。誰か(自分でも良い)が作ったRustのコードを自分のプロジェクトでも使いたいときに「このプロジェクトはこのコードを利用します(=依存します)」という関係を依存関係と呼びます。
Rustでは、外部から利用できるようにビルドされたものを「パッケージ」と呼びます。他のパッケージを利用したい場合は、以下のコマンドを実行して追加します。
cargo add <パッケージ名>
例えば、乱数を扱うときに便利なrand
というパッケージがあります。これを利用したい場合は、以下のコマンドを実行します。
cargo add rand
実行すると、プロジェクト内のCargo.toml
の[dependencies]
にその依存関係が自動的に追加されます。
rand = "0.8.5"
cargo add
を使うと、
- パッケージのインストール
-
Cargo.toml
への追記
の両方を同時に実行できます。
先にCargo.toml
へ手動で追記しておくことも可能で、その場合はcargo build
などのコンパイル時に自動でインストールされます。
このあたりは、Node.jsでいうnpm install
やpackage.json
の関係に似ていますね。
パッケージを使ってみる
追加したパッケージは、<パッケージ名>::<使いたい関数など>
のようにアクセスします。
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let random_number: u8 = rng.gen_range(1..=100);
println!("ランダムな数: {}", random_number);
}
パッケージの実体はどこにあるのか?
Rustのプロジェクトで依存パッケージを追加すると、そのパッケージの実体はどこに保存されるのでしょうか?
Rustでは、外部パッケージは通常、プロジェクトのディレクトリ内ではなく、グローバルなキャッシュに保存されます。依存パッケージの実体は、以下の場所に保存されます。
-
~/.cargo/registry
(Linux/macOSの場合) -
C:\Users\<ユーザー名>\.cargo\registry
(Windowsの場合)
これらのディレクトリには、Cargo.toml
で指定されたパッケージのソースコードが格納されており、依存関係が解決されると、Cargoが必要なパッケージをここから取り出してビルドします。
プロジェクトのディレクトリではなく、グローバルなキャッシュの領域にパッケージをダウンロードしておくことで、効率かつ高速な依存関係の解決が可能です。
ここはNode.jsのモジュールシステムに無い利点(というかNode.jsのほうが欠点が多い)ですね。
筆者はちょっとしか触っていませんが、Go言語もこっちの思想を持っている認識です。
余談ですがNode.jsに代わるJSランタイムであるDenoもこちらの方式を採用しています。