Rustのパッケージ管理ツール(cargo)

Cargoとは?

CargoはRustプログラムのパッケージ管理、依存管理、ビルド等を行うRust公式のパッケージマネージャです。

その他の言語ではPythonの「pip」やPHPの「Composer」等にに相当するものとなっております。

前項目の「Hello, World!」の出力のような単純なRustプログラムではプロジェクト管理は不要となりますがより複雑なシステムを構築する際はCargoを使用して管理する事で効率的に開発を進める事ができます。

基本的にはRustインストール時に合わせてインストールが行われています。

ターミナルにて下記コマンドを使用する事でバージョンの確認を行う事ができます。

バージョン番号が表示されていれば正常にインストールが完了しています。

cargo --version

1.Cargoでプロジェクトを作成する

次にCargoを使用してプロジェクトの作成を行っていきます。

プロジェクトの作成は「cargo new プロジェクト名」と実行する事で作成可能となります。

今回は例として「hello_cargo」としてプロジェクトを作成します。

下記のコマンドにてプロジェクトを作成する事が出来ます。

cargo new hello_cargo

プロジェクトが問題なく作成されたら下記のような標準出力が表示がされます。

Created binary (application) `hello_cargo` package

上記実行後「ls」コマンドで確認すると先ほど作成した「hello_cargo」ディレクトリが作成されております。

ls -al
hello_cargo

次にプロジェクトディレクトリへ移動します。

cd  hello_cargo

上記実行後「ls」コマンドで確認すると下記のようなファイルが生成されています。

ls -al

Cargo.toml
.git
.gitignore
src

「Cargo.toml」はプロジェクトの設定ファイルとなっており、依存関係やプロジェクトのメタデータが含まれています。

「src」はソースコードが格納されるディレクトリです。デフォルトで「main.rs」ファイルが作成されます。

「.git」はGitのリポジトリディレクトリです。
このディレクトリにはGitが使用するコントロールファイルなどが含まれており、プロジェクトの変更履歴がここに保存されます。

「.gitignore」はGitで無視されるファイルやディレクトリを指定するための設定ファイルです。
通常はビルドされたファイルや一時ファイルなどを無視するために使用されます。

〇応用

プロジェクト作成時にcargo newコマンドに–vcsフラグを与えることで、

別のバージョン管理システムを指定したり何も利用しないように指定する事も可能となっております。

## Mercurial
$ cargo new --vcs hg プロジェクト名

## Bazaar
cargo new --vcs bzr プロジェクト名

## Fossil
cargo new --vcs fossil プロジェクト名

## バージョン管理なし
cargo new --vcs none プロジェクト名

2.Cargo.tomlの確認

次に「Cargo.toml」の中身について解説致します。

「Cargo.toml」はTOML形式の拡張子で作成されております。

下記コマンドにて先ほどの「Cargo.toml」を表示させます。

cat  Cargo.toml

上記を実行すると下記のように表示されるはずです。

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

「package」は パッケージのメタデータを定義するセクションとなっております。

指定する情報はコンパイル時に必要となる設定情報を記述します。

  • name
    nameではパッケージの名前を指定する事が出来ます。
  • version
    versionではパッケージのバージョンを指定出来ます。
  • edition
    editionではRustのエディションを指定する事が出来ます。

「dependencies」は プロジェクトが依存している外部のライブラリ等を指定する事が出来ます。

3.main.rsの確認、変更

次に「main.rs」の中身について解説致します。

Cargoで作成されたプロジェクトのソースコードは「src」ディレクトリに格納する事が最適とされております。

「Cargo.toml」等がある1階層にはソースコードは設置せず、READMEファイル、ライセンス情報、設定ファイル等のソースコードとは関係のないプロジェクトファイルを設置します。

プロジェクトを作成するとsrcディレクトリ配下に「main.rs」が作成されます。

それでは確認の為、srcディレクトリ配下に移動します。

cd  src

移動し「ls」コマンドを使用すると「main.rs」ファイルが存在する事を確認出来ます。

ls -al
main.rs

下記コマンドにて先ほどの「main.rs」を表示させます。

cat  main.rs

上記実行すると下記のソースコードが表示されます。

デフォルトでは「Hello, world!」の標準出力のプログラムがmain関数内に記述されております。

fn main() {
    println!("Hello, world!");
}

下記コマンドを使用し出力される文字を変更します。

vi  main.rs

今回は例として「Hello, CargoProject!」と表示さるよう変更します。

fn main() {
    println!("Hello, CargoProject!");
}

4.プロジェクトのビルドと実行

次にプロジェクトのビルドを行います。

該当プロジェクトディレクトリ内で下記コマンドを実行してください。

cargo build

上記を実行すると下記のように表示されます。

   Compiling hello_cargo v0.1.0 (プロジェクトフルパス)
    Finished dev [unoptimized + debuginfo] target(s) in 0.45s

「cargo build」を実行するとプロジェクトディレクトリ直下に「Cargo.lock」という新しいファイルが作成されます。

「Cargo.lock」ファイルはビルド時に使用したライブラリ等の正確なバージョンを情報記録したファイルとなっております。

前回の「Hello, World!」の出力時の「rustc 」を使用したコンパイルでは

同一ディレクトリにバイナリファイルが作成されておりましたがCargoの場合は異なるディレクトリに作成されます。

バイナリファイルのパスは「プロジェクトディレクトリ/target/debug/バイナリファイル」となります。

今回の場合は以下のディレクトリに作成されます。

hello_cargo/target/debug/hello_cargo

プロジェクトディレクトリ直下にて下記をコマンド実行するとバイナリファイルを実行する事が出来ます。

./target/debug/hello_cargo

Cargoではバイナリファイルを指定せずともプロジェクトファイル内にいれば下記コマンドを使用して実行する事が可能となっております。

cargo run

上記を実行すると下記のような表示がされます。

「cargo run」ではcargoがファイル更新を検知し変更がある場合は自動で再ビルドを実行してくれます。

変更がない場合は再ビルドを実行せず、バイナリファイルを実行します。

    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/hello_cargo`
Hello, CargoProject!

下記を使用する事で現在のページにて実行可能です。

5.コンパイルチェック

Cargoではコンパイル前に「cargo check」コマンドを使用し.コンパイルチェックを行う事が出来ます。

「cargo check」はコードが問題なくコンパイルできるか確認するコマンドとなります。

実際にバイナリファイルの生成は行いません。

「cargo check」を使用する事で実行ファイルを生成するステップを省くことができ

効率的にコードのチェックを行う事が可能となります。

cargo check

6.リリースに向けたビルド

リリースに向けたビルドを行うには「–release」オプションを使用してビルドします。
リリース用オプションを使用する事で最適化した状態でコンパイルする事が出来ます。

cargo build --release

通常のコンパイルコマンドではデバッグ情報が含まれる為、実行速度がリリースコンパイル時よりも劣ります。

またリリースオプションを使用した場合はバイナリファイルの書き出しパスが異なります。

./target/release/hello_cargo