社長、ほのぼの開発日記②
はじめに
お世話になります!
アイスマイル合同会社の代表社員の李春秀(リ チュンス)です!
前回でRustプログラミングの第一歩を踏みました^^
今回もドキュメントに従って進めていきたいと思います。
パッケージマネージャー
今回は、Rustのパッケージマネージャーを触ってみます。
JavaScriptでいうnpmとかですね。
本文にも書いてある通り、単独の独立したプログラムを作成する場合はあまり考慮は不要ですが、ライブラリやパッケージを利用する場合は、そちらに依存するプログラムを書くことになるので、依存関係を考えないといけません。
新しいバージョンが出たり、古いバージョンに脆弱性が出た場合などは、ライブラリを更新しなければならないですが、依存するプログラムも各バージョンに対応させないといけないなど、管理が大変です。
複数のプログラムが依存した状態になると、バージョンを更新するのも一苦労💦ここで登場するのがパッケージマネージャーです。
パッケージマネージャーは、ライブラリやパッケージの依存関係を効率よく管理してくれるツールです。
細かい挙動は今後見ていくとして、とりあえずRustのパッケージマネージャーを使ってみましょう!
「Cargo」と呼ばれるみたいでRustをインストールした時にすでにインストール済みのようです。確認してみましょう。
cargo --version
確かにインストールされてますね!
CargoでHello World!
続いて、Cargoを使ってHello World!してみたいと思います。
プロジェクトを作成します。
cargo new hello_cargo
コマンドはシンプルですね。
hello_cargoというディレクトリが作成されるので、中身を見てみましょう。
cd hello_cargo
ls
src直下には、main.rsが作成されています。
ちなみに、gitのリポジトリも同時に作ってくれるみたいです。ブランチはデフォルトでmasterブランチになっていました。
さて、Cargo.tomlファイルを開いてみましょう。
vi Cargo.toml
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
TOML形式で書かれています。
TOML形式というのは恥ずかしながら初めて知りましたが、「Tom's Obvious Minimal Language」の略だそうです。
トムさんはGitHubを創業した一人ですね、いやぁ、マジで人類に貢献してる。(ハラスメント騒動はあったみたいすが。。)
key,valueと=で繋ぐ感じが読みますいですね。
[package]にもろもろ情報を書き、[dependencies]に依存関係が記載されていく感じですね。これもおいおいですね!
Cargoでは、src以下にソースコード、トップレベルには設定やREADMEなどを置くような感じで最初から構造化してくれてますね!
では、ビルドも見ていきましょう。下記のコマンドでビルド可能です。
cargo build
結果は下記のとおりです。(スクショより、こっちの方が見やすいですね。。)
Compiling hello_cargo v0.1.0 (/Users/lee/hello_cargo)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 7.36s
もう一度lsしてみましょう
Cargo.lock Cargo.toml src target
Cargo.lockとtargetが新規で作られています。
デフォルトでは、デバッグ用にビルドされるみたいです。プロジェクト直下のtarget/debug/以下にhello_cargoというバイナリファイルが出来上がっています。
実行してみましょう。
./target/debug/hello_cargo
Hello, world!
できましたね!
Cargo.lockには、プロジェクトの正確な依存関係が管理されるみたいです。こちらを使えば、他の環境でも再現可能ですね。
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "hello_cargo"
version = "0.1.0"
今回は、特に依存関係がないのでpackageの箇所だけ記載されています。
ビルドして、実行する手順を別々にしてましたが、これらを同時にできる方法も用意されているみたいです。
cargo run
ビルドと同時に実行もしてくれるので便利ですね。
lee@MacBook-Pro-2 hello_cargo % cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/hello_cargo`
Hello, world!
バイナリを生成せず、コンパイルチェックを行うコマンドも用意されています。
lee@MacBook-Pro-2 hello_cargo % cargo check
Checking hello_cargo v0.1.0 (/Users/lee/hello_cargo)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.38s
buildよりも速いので、結構使いそう。
本番用を生成するには、releaseオプションをつけるみたいです。
lee@MacBook-Pro-2 hello_cargo % cargo build --release
Compiling hello_cargo v0.1.0 (/Users/lee/hello_cargo)
Finished `release` profile [optimized] target(s) in 1.06s
target配下に、releaseディレクトリが生成されています。
lee@MacBook-Pro-2 hello_cargo % ls target/release/hello_cargo
target/release/hello_cargo
ついでに実行してみましょう!
lee@MacBook-Pro-2 hello_cargo % ./target/release/hello_cargo
Hello, world!
できました!
終わりに
今日は、Cargoを使った「Hello, world!」表示プログラムを公式サイトに沿って作りました!
ていうか、公式サイトのただの和訳になっている気もしないでもないですが。。。。
最後に、いっそ公式のまとめを貼り付けて終わりとさせていただきます!😂
We can create a project using cargo new.
We can build a project using cargo build.
We can build and run a project in one step using cargo run.
We can build a project without producing a binary to check for errors using cargo check.
Instead of saving the result of the build in the same directory as our code, Cargo stores it in the target/debug directory.
次回から第二章やります♪