Site cover image

Site icon imagehtrkwn.dat

Just a htrkwn's personal hobby scrapbook.

🦀Rust学習日記:Hello, Cargo! - Day3

$ 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ディレクトリが生成されている。