macOSでRustのローカル開発環境を整えるための手順2022

# このページについて

macOSでのRustのローカル開発環境を整えるための手順を紹介します。

Rust自身についての説明は以下のページをご参照ください。

https://www.rust-lang.org/ja

# 動作確認環境

* macOS Monterey (12.1)
* MacBook Pro (14インチ、2021)
* チップ: Apple M1 Max

```sh
$ sw_vers
ProductName:	macOS
ProductVersion:	12.1
BuildVersion:	21C52
```

検証にはM1 Max(Apple Silicon系の)チップを使っていますが、Intel Macでも同様に動くと思います。

もし以下の手順で動かなかった場合は、その旨をコメントか編集リクエストいただけますと幸いです。

# 必要なもの

Rustのローカル開発環境を用意するには、あらかじめ以下のツールが必要となります。インストールしておきましょう。

* Xcode command line tools
    * ターミナルで `xcode-select --install` を実行する

# Rustローカル開発環境構築

## 1. rustup のインストール

すべてはここから。

Rustを使ったプログラミングを行えるように、Rustコンパイラのアップデートや開発に必要なツール類を管理するための `rustup` をインストールします。

https://www.rust-lang.org/ja/tools/install

macOSの場合は [Homebrew](https://brew.sh/index_ja) を使うと簡単に導入できます。

```sh:ターミナル
# rustupインストールおよびrust環境のセットアップ
brew install rustup-init
rustup-init
# シェルの再起動
exec $SHELL -l
```

Homebrew を使わずにインストールすることもできます。

```sh:ターミナル
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

rustupのインストールが完了しましたら、rustupコマンドが実行できるか確かめてみましょう。
以下のコマンドを実行します。

```sh:ターミナル
rustup --version
```

```sh:実行結果
rustup 1.24.3 (ce5817a94 2021-05-31)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.58.1 (db9d1b20b 2022-01-20)`
```

このようにrustupのバージョンが表示されればOKです。

:::note
バージョン番号はrustupをインストールした時期によって変わってきますが、このバージョンより新しいものであれば特に問題ありません。
2022/1/24現在だとrustupのバージョンは1.24.3です。
:::

また、rustupがインストールされると同時に、Rustのコンパイラである `rustc` と、ビルドシステム兼パッケージマネージャの `cargo` も一緒にインストールされます。確認してみましょう。

```sh:ターミナル
rustc --version
#=> rustc 1.58.1 (db9d1b20b 2022-01-20)

cargo --version
#=> cargo 1.58.0 (f01b232bc 2022-01-19)
```

これらがRustでプログラミングを始めるのに必要最低限のツールとなります。

## 2. Rustの動作確認 - Hello World

動作確認のため、ターミナルで適当な作業用ディレクトリに移動し、以下のコマンドを実行してみましょう。

```sh:ターミナル
# rustプロジェクトファイルの作成
cargo new hello_rust

# ディレクトリの移動
cd hello_rust

# Rustプログラムのコンパイルと実行
cargo run
```

```text:実行結果
   Compiling hello_rust v0.1.0 (<作業ディレクトリ>/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.39s
     Running `target/debug/hello_rust`
Hello, world!
```

実行結果の最後に `Hello, world!` と表示されれば成功です。

少しプログラムを書き換えてみましょう。お好きなエディターを使って、 `src/main.rs` ファイルを開き、以下のように書き換えます。

```rust:src/main.rs
fn main() {
    for n in 0..10 {
        println!("{n}: Hello, Rust!");
        // NOTE: 文字列中で変数を展開する記法は、古いバージョンのRustだと動かない場合があります
        // その場合は以下に書き換えてください。
        // println!("{}: Hello, Rust!", n);
    }
}
```

`src/main.rs` 書き換えたら、保存して実行します。

```sh:ターミナル
cargo run
```

```text:実行結果
   Compiling hello_rust v0.1.0 (<作業ディレクトリ>/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `target/debug/hello_rust`
0: Hello, Rust!
1: Hello, Rust!
2: Hello, Rust!
3: Hello, Rust!
4: Hello, Rust!
5: Hello, Rust!
6: Hello, Rust!
7: Hello, Rust!
8: Hello, Rust!
9: Hello, Rust!
```

実行結果が変わりましたね。修正したコードが実行結果に反映されていることが確認できました。

## 3. 開発効率をあげるツールのインストール

### cargo-edit - パッケージの追加/削除サブコマンド追加

Rustのビルドシステム兼パッケージマネージャーのCargoは、デフォルトだとパッケージの依存関係を追記する際に `Cargo.toml` ファイルを手動で書き換える必要があります。

パッケージの依存関係を追加する際に毎回ファイルを編集するのも大変なので、 `cargo add <パッケージ名>` のようにコマンドでパッケージの依存関係を追加することができる `cargo-edit` を導入します。

https://crates.io/crates/cargo-edit

```sh:ターミナル
# cargo-editのインストール
cargo install cargo-edit
```

これでcargo-editの機能が使えるようになりました。

```sh:cargo-editの使い方一例
# パッケージの追加
cargo add <パッケージ名>
cargo add <パッケージ名>@<バージョン指定>

# パッケージの追加(開発用)
cargo add <パッケージ名> --dev

# パッケージのアップグレード
cargo upgrade <パッケージ名>

# パッケージの削除
cargo rm <パッケージ名>
```

### cargo-watch - ファイル変更検知

コードを修正する度にターミナルで `cargo run` を実行するのは面倒です。

そこでファイルの変更を監視し、ファイルの変更を検知すると自動的にビルドや実行を行ってくれる `cargo-watch` というツールがあります。

https://crates.io/crates/cargo-watch

`cargo-watch` をインストールするには以下のコマンドを実行します。

```sh:ターミナル
cargo install cargo-watch
```

`cargo-watch` の使い方ですが、ファイル変更検知した際に自動実行したいコマンドを `cargo watch -x` につづけて渡します。　

```sh
# cargo check の自動実行
cargo watch -x check

# cargo test の自動実行
cargo watch -x test

# cargo run の自動実行
cargo watch -x run

# check, test, run の連続実行
cargo watch -x check -x test -x run

# cargoではないコマンドの自動実行
cargo watch -- echo Hello world
```

ファイル変更後にエディターとターミナルの行き来が少なくなるため、開発効率をあげることができるかと思います。

### rustfmt - コードフォーマッター

Rustには `rustfmt` というコードフォーマッターが用意されています。

https://github.com/rust-lang/rustfmt

コードフォマッターを使用することで、コードのスタイルを自動で修正してくれます。

また、コードのスタイルが統一されることで、より本質的なロジックに集中することができ、チーム開発において、スタイルに関する不毛な議論を終わらせる手助けもしてくれます（たぶん）。

`rustfmt` の導入は `rustup component add` コマンドを使います。

```sh
rustup component add rustfmt
```

これで `rustfmt` コマンドおよび `cargo fmt` コマンドが使えるようになります。

ためしに、 `src/main.rs` を以下のように書き換え、スタイルをあえて崩した状態で保存します。

```rust:src/main.rs
fn main(){
for n in 0..10{
println!("{n}: Hello, Rust!");
}
}
```

この状態で `rustfmt` または `cargo fmt` コマンドを実行します。

```sh
# コードスタイルの修正
rustfmt src/main.rs

# または
cargo fmt
```

再び `src/main.rs` ファイルを確認すると、コードのスタイルが自動修正されているのがわかります。

```rust:src/main.rs
fn main() {
    for n in 0..10 {
        println!("{n}: Hello, Rust!");
    }
}
```

コードを修正して、Git等のバージョン管理システムにコミットする前には `rustfmt` または `cargo fmt` を実行することを癖付けておくとよいでしょう。

### Clippy - 静的解析ツール

ClippyはRustの静的解析ツールで、よくある間違いを見つけてRustのコード改善のヒントを出してくれます。

https://github.com/rust-lang/rust-clippy

`rustup component add` サブコマンドを使ってインストールします。

```sh
rustup component add clippy
```

使い方は簡単で、 `cargo clippy` を実行するだけです。

```sh
cargo clippy
```

コードに問題があれば、エラーまたは警告が発生します。

### rust-analyzer - VS Code拡張機能

VS Codeを使ってRustのコードを書く際に便利な `rust-analyzer` を紹介します。

https://github.com/rust-analyzer/rust-analyzer

現在はまだプレビュー状態ですが、rust-analyzerを使うとコード補完が高速に表示されたり、コードジャンプができるようになるのでオススメです。

`rust-analyzer` を使うためには、`rls`, `rust-src`, `rust-analysis`の3つのrustup componentを追加する必要があります。

```sh
rustup component add rls rust-src rust-analysis
```

続いてVS Codeに `rust-analyzer` 拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer

基本的にはこれだけです。あとはVS CodeでRustプロジェクトを開いて、しばらく経つとコード補完やコードジャンプが使えるようになります。

![スクリーンショット 2022-01-24 13.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24450/dd2f05a0-f7e7-5686-9916-1d2e89614c85.png)

なお、2022/1/24現在ではプレビュー状態なので、たまに補完が効かなくなったり、コードジャンプができなかったりする時があります。

その状態になってしまった場合は `Command + Shift + P` でコマンドパレットを開き、`Rust Analyzer: Restart server` を実行するとだいたい直ります。

![スクリーンショット 2022-01-24 13.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24450/e175fa12-32c4-b6f7-6a1d-35e4b973eaf1.png)

お試しあれ。

# Tips

## Rustの最新版をインストール(アップデート)する

ターミナルで `rustup update` コマンドを実行します。

```sh
# 安定版のみアップデートする
rustup update stable

# nightlyビルドのみアップデートする
rustup update nightly

# すべてアップデートする
rustup update
```

* 参考: https://rust-lang.github.io/rustup/basics.html

# 参考ページ

* [Rustプログラミング言語](https://www.rust-lang.org/ja)
* [付録D：便利な開発ツール - The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/appendix-04-useful-development-tools.html)
* [cargo-edit](https://crates.io/crates/cargo-edit)
* [cargo-watch](https://crates.io/crates/cargo-watch)
* [rustfmt](https://github.com/rust-lang/rustfmt)
* [rust-clippy](https://github.com/rust-lang/rust-clippy)
* [rust-analyzer](https://github.com/rust-analyzer/rust-analyzer)
* [Zero To Production In Rust](https://www.zero2prod.com/index.html)