$ cargo --version
cargo 1.75.0 (1d8b05cdd 2023-11-20)
Rustのビルドシステム兼パッケージマネージャ Cargo がちゃんと入っている。最初にrustc入ってないぞってエラーが出てhelpで表示されたコマンド打った後にダウンロードされていました。
今回からVSCodeでWSLのUbuntuに接続して作業しています。
Cargo プロジェクトの作成
$ cargo new hello_cargo
Created binary (application) `hello_cargo` package
$ cd hello_cargo
$ ls -a
. .. .git .gitignore Cargo.toml src
$ ls -a src
. .. main.rs
gitリポジトリが初期化されている。git以外を使いたい場合は、cargo new
コマンドに --vcs
オプションをつけて指定する。(cargo new --vcs=git
)
👀 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]
Cargo.toml(Cargoの設定フォーマット)はTOML形式で書く。
[package] セクション以下3行(name, version, edition)はCargoがプログラムをコンパイルするのに必要となる設定情報。editionは使用するRustのエディション。
[dependencies] セクション以下にはプロジェクトの依存(コードが必要とするライブラリ)を列挙する。(Node.jsのpackage.jsonみたいなもの?という理解で進める)
ここで見慣れない単語が登場する。
Rustではコードのパッケージのことをクレートと呼びます。
https://doc.rust-jp.rs/book-ja/ch01-03-hello-cargo.html
In Rust, packages of code are referred to as crates.
https://doc.rust-lang.org/book/ch01-03-hello-cargo.html
クレート crate(可算名詞) 、木箱とか木枠とかのイメージだが、とにかくそう呼ぶらしいので、進めていけば嫌でも目にするだろうから、そのうち慣れてくるだろう。
👀 src/main.rs
これは cargo new
したときに自動で作成された”Hello, world!”を出力するコード。
$ cat src/main.rs
fn main() {
println!("Hello, world!");
}
Cargoはソースファイルがsrcディレクトリにあることを期待します。 プロジェクトの最上位のディレクトリは、READMEファイル、ライセンス情報、設定ファイル、その他のコードに関係しないものだけを置きます。 - https://doc.rust-jp.rs/book-ja/ch01-03-hello-cargo.html
プロジェクト内はしっかり整頓しろと圧をかけられている。
Cargoプロジェクトとしてビルド
$ cargo build
Compiling hello_cargo v0.1.0 (/home/***/projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 5.77s
$ ./target/debug/hello_cargo
Hello, world!
cargo build すると新しくCargo.lockファイルとtargetディレクトリが作られてなんかいろいろ生成されている。
$ ls
Cargo.lock Cargo.toml src target
$ ls target
CACHEDIR.TAG debug
$ ls -R target
target:
CACHEDIR.TAG debug
target/debug:
build deps examples hello_cargo hello_cargo.d incremental
target/debug/build:
target/debug/deps:
hello_cargo-4376c0aedfff852b hello_cargo-4376c0aedfff852b.d
target/debug/examples:
target/debug/incremental:
hello_cargo-33xmvfw9nkik4
target/debug/incremental/hello_cargo-33xmvfw9nkik4:
s-gseh7v7z9k-urtz2k-7oz7ls6k2v4xzwjhee1326s00 s-gseh7v7z9k-urtz2k.lock
target/debug/incremental/hello_cargo-33xmvfw9nkik4/s-gseh7v7z9k-urtz2k-7oz7ls6k2v4xzwjhee1326s00:
22ooc16y2vg92ycp.o 2rnphrbrs6di4ihi.o 4vg2rkptj5vwbuoh.o nxk9m05bafkk431.o work-products.bin
2nex88uheo4qswjd.o 3fkgmdujpx2v2tq8.o dep-graph.bin query-cache.bin
cargo run
コマンドを使うとコンパイルから生成されたファイルの実行までを続けてやってくれる。もしソースコード(このプロジェクトではsrc/main.rs)に変更がなければコンパイルせずにバイナリの実行だけを行うらしい。
コンパイルできるかどうか事前にチェックするときは cargo check
コマンドを使う。実行ファイルは生成しない。
リリースビルドを行う
cargo build --release
で最適化した状態でコンパイルする。(コンパイル時間は長くなる)
$ cargo build --release
Compiling hello_cargo v0.1.0 (/home/***/projects/hello_cargo)
Finished release [optimized] target(s) in 1.03s
$ ./target/release/hello_cargo
Hello, world!
$ ls target
CACHEDIR.TAG debug release
$ ls -R target/release
target/release:
build deps examples hello_cargo hello_cargo.d incremental
target/release/build:
target/release/deps:
hello_cargo-69c40f9dddfd4d74 hello_cargo-69c40f9dddfd4d74.d
target/release/examples:
target/release/incremental:
targetディレクトリ下にreleaseディレクトリが生成されている。