Rustのツールと環境構築
Rustを始めると、rustup、rustc、cargo、clippy、rustfmt、rust-analyzer と、新しい名前が一度にたくさん出てきます。1行書くだけなのに、ツールを10個もそろえないといけないように感じるかもしれません。でも安心してください。インストーラーをひとつ実行すれば、そのほとんどが手に入ります。しかも、どのツールも役割ははっきりひとつだけです。
キッチンにたとえてみましょう。rustup は、調理器具を届けて新しいものに取り替えてくれるお店です。cargo は、すべてを取り仕切るシェフです。clippy は肩越しにアドバイスをくれる親切な先生で、rustfmt は調理台をいつもきれいに片付けてくれます。このページでは、それぞれのツールの役割、OSごとに必要なもの、そしてRust開発者がふだんどうツールを使っているかを説明します。
まだRustをインストールしていない場合は、インストール手順と最初のプロジェクトの作り方をRustを始めるで紹介しています。cargo の基本(cargo new、cargo add、Cargo.toml)はCargoとクレートにあります。このページは、その2つの続きです。
ツールをひとつの表にまとめました。
| ツール | 役割 | rustupに含まれる? |
|---|---|---|
rustup |
Rustのインストール、アップデート、バージョンの切り替え | これ自体がインストーラー |
rustc |
コンパイラ。.rs ファイルをプログラムに変換する |
はい |
cargo |
ビルド、実行、テスト、クレートの追加。ほとんどの作業でこれを使う | はい |
rustup doc |
標準ライブラリのドキュメントとRust Bookを、ブラウザでオフラインで開く | はい(default プロファイル) |
clippy |
リンター。バグや、もっとシンプルな書き方を教えてくれる | はい(default プロファイル) |
rustfmt |
フォーマッタ。コードを標準のスタイルに書き直す | はい(default プロファイル) |
rust-analyzer |
「エディタの頭脳」。補完、その場でのエラー表示、型ヒント、定義へのジャンプ | 標準では入らない。VS Codeの拡張機能が自分用のコピーを持っている |
| デバッガ | 指定した行でプログラムを止めて、変数の中身を見る | いいえ。LLDBやGDB(またはそれを含むエディタ拡張機能)を自分で入れる |
プロファイル(profile)とは、rustupがまとめてインストールするコンポーネントのセットのことです。通常のインストールでは default プロファイルが使われ、コンパイラとcargoに加えて、ドキュメント、clippy、rustfmt が入ります。もし誰かが minimal プロファイルでセットアップしたマシンだと、cargo clippy を実行したときに「インストールされていない」と言われます。そのときは rustup component add clippy rustfmt というコマンドひとつで解決します。
一度 rustup doc --std を試してみてください。標準ライブラリのドキュメント一式が、あなたのディスクから直接開きます。飛行機の中や回線が遅いときでも使えます。自分のプロジェクトと、そこで使っているすべてのクレートのドキュメントを見たいときは cargo doc --open を実行します(詳しくはドキュメントで説明しています)。
インストールの前に:OSごとに必要なもの
Section titled “インストールの前に:OSごとに必要なもの”Rustはコードをコンパイルしますが、最後の仕上げにリンカ(linker)が必要です。リンカとは、コンパイルされた部品をつなぎ合わせて、実行できるひとつのファイルにするプログラムです。Rustは、システムのCのツールに含まれるリンカを使います。そのため、OSごとにちょっとした準備がいるのです。
| OS | インストールするもの | 方法 |
|---|---|---|
| Windows(おすすめ) | Visual StudioのC++ツール(MSVCリンカとWindows SDK) | Visual Studioインストーラーで Desktop development with C++(C++によるデスクトップ開発)のワークロードを選ぶ |
| Windows(別の方法) | GNUツールチェーン(MinGW) | rustup toolchain install stable-gnu |
| Windows(もうひとつの方法) | WSL(Windowsの中で動く本物のLinux) | wsl --install を実行し、あとはLinuxの手順に従う |
| macOS | Appleのコマンドラインツール(Cコンパイラとリンカを含む) | xcode-select --install |
| Debian / Ubuntu | Cコンパイラとリンカ | sudo apt install build-essential |
| Fedora | Cコンパイラとリンカ | sudo dnf install gcc |
正直に知っておいてほしいことがいくつかあります。
- WindowsとVisual Studio。 自分で探す必要はありません。Visual Studioが入っていなければ、
rustup-init.exeがインストールを提案してくれます。このときに入るのは Visual Studio Community です。個人、学生、オープンソースの開発には無料ですが、すべての企業で無料というわけではありません。仕事のパソコンに入れるときは、会社がどのエディションを使っているか確認しましょう。「Desktop development with C++」のワークロードを選べば、Rustに必要なものはすべてそろいます。 - WindowsとGNU。 標準はMSVCツールチェーンで、ほかのWindowsソフトウェアとの相性もいちばん良いです。GNUツールチェーンなら、簡単なプログラムはVisual Studioなしでビルドできます。ただ、Cのコードを含む多くのクレートは、MinGW入りのMSYS2も入れないとビルドできません。ほとんどの人はMSVCのままにしておくのがおすすめです。
- WSL は、WindowsでLinuxの環境がほしいとき(たとえば、本番サーバーがLinuxのとき)にとても良い選択です。WSLの中では、Windows側のインストールとは別に、通常のLinuxのコマンドでRustをインストールします。
- Linuxで追加が必要なもの。 人気のクレートの中には、システムのライブラリを使うものがあります。
pkg-configやOpenSSLについてのメッセージでビルドが失敗したら、Ubuntuではpkg-configとlibssl-devもインストールしてください。
準備ができたら、Rustを始めるのインストール手順に進みましょう。
rustupを使ってみる
Section titled “rustupを使ってみる”Rustをインストールしたら、その管理には rustup を使います。Rustの新しい安定版は6週間ごとに出るので、アップデートはふだんの習慣にしましょう。
rustup update # インストール済みのツールチェーンをすべて(rustup自身も)アップデートするrustup show # 何がインストールされていて、ここでどのツールチェーンが有効かrustup show は、たとえば次のように表示します(一部省略)。
Default host: x86_64-unknown-linux-gnu
installed toolchains--------------------stable-x86_64-unknown-linux-gnu (active, default)
active toolchain----------------name: stable-x86_64-unknown-linux-gnuactive because: it's the default toolchainstable、beta、nightly
Section titled “stable、beta、nightly”ツールチェーン(toolchain)とは、rustc、cargo などをひとそろいにしたものです。Rustには3つのリリースチャンネルがあります。
| チャンネル | どんなものか | 使う場面 |
|---|---|---|
| stable | 公式リリース。6週間ごとに出る | ほぼいつもこれ。あなたがほしいのはこれです |
| beta | 次のstableリリースで、テスト中のもの | 次のリリースの前に、自分のプロジェクトが動くか確かめたいとき |
| nightly | 毎晩ビルドされ、実験的な機能を含む | ツールやクレートに求められたとき、または新機能を試したいとき |
複数のツールチェーンを並べてインストールできます。
rustup toolchain install nightly # stableと並べてnightlyをインストールするcargo +nightly build # このコマンドだけnightlyを使うrustup default stable # どこでも使うツールチェーンを選ぶプロジェクトごとにツールチェーンを固定する
Section titled “プロジェクトごとにツールチェーンを固定する”プロジェクトによっては、特定のバージョンのRustが必要なことがあります。プロジェクトのフォルダに rust-toolchain.toml というファイルを置くと、そのフォルダで作業するときにrustupが自動で切り替えてくれます。
[toolchain]channel = "1.97.0"components = ["clippy", "rustfmt"]targets = ["wasm32-unknown-unknown"]このファイルはgitにコミットしましょう。そうすれば、チームの全員(とCI)がまったく同じコンパイラを使えます。足りなければrustupが自動でインストールしてくれます。とはいえ、小さなプロジェクトのほとんどはこのファイルを必要としません。最新のstableを使えば十分です。
コンポーネントとターゲット
Section titled “コンポーネントとターゲット”コンポーネント(component)は、ツールチェーンに追加できる部品です。ターゲット(target)を使うと、別の種類のマシン向けにコンパイルできます。
rustup component add clippy rustfmt rust-src # rust-src: 標準ライブラリのソースコード。rust-analyzerが使うrustup component list --installed # 入っているものを確認するrustup target add wasm32-unknown-unknown # ブラウザ向けにRustをコンパイルするwasm32-unknown-unknown ターゲットは、WebAssemblyに必要なものです。
エディタとIDE
Section titled “エディタとIDE”Rustはどんなテキストエディタでも書けますが、rust-analyzer(またはそれに近いエンジン)が使えるエディタだと、まったく違います。入力している最中にエラーが見え、変数の型がすぐ横に表示され、どんな関数の定義にもジャンプできます。初心者にとって、このフィードバックは辛抱強い家庭教師がついているようなものです。
| エディタ | 価格 | Rustのサポート | 向いている人 |
|---|---|---|---|
| VS Code + rust-analyzer | 無料 | 公式のrust-analyzer拡張機能 | ほとんどの人。いちばん人気があり、多くの解説もこれを前提にしている |
| RustRover(JetBrains) | 非商用(学習、趣味のプロジェクト、報酬のないオープンソース)なら無料。仕事で使うには有料のサブスクリプションが必要 | 組み込み。JetBrains独自のRustエンジンとデバッガ付き | 何でもそろったIDEが好きな人 |
| Zed | 無料、オープンソース | 組み込み(rust-analyzerを使い、デバッグにはCodeLLDBを使う) | とても速くてモダンなエディタがほしい人 |
| Neovim / Helix | 無料、オープンソース | rust-analyzer経由。Helixはほぼそのまま使え、Neovimは少し設定が必要 | ターミナルでの作業が大好きな人 |
| Visual Studio | 有料エディションと、無料のCommunity | Rustの公式サポートなし | Rustには向かない。必要なのはリンカのためのC++ Build Toolsだけ |
RustRoverのライセンス条件は変わることがあります。仕事で使う前に、RustRoverのページ(英語)で最新のルールを確認してください。
NeovimやHelixなどのエディタでは、rustup component add rust-analyzer でrust-analyzerのプログラム本体をインストールします。
おすすめのVS Code拡張機能
Section titled “おすすめのVS Code拡張機能”VS Codeを使うなら、次の4つでほぼすべてをカバーできます。
- rust-analyzer:必須の拡張機能です。補完、エラー表示、ヒント、リファクタリング。
- CodeLLDB:ブレークポイントやステップ実行のためのデバッガです。LLDBのコピーが同梱されています。
- Even Better TOML:
Cargo.tomlに色を付けて、間違いをチェックしてくれます。 - Error Lens(お好みで):マウスを乗せたときだけでなく、その行にエラーメッセージを直接表示します。大好きな人もいれば、うるさく感じる人もいます。
CodeLLDBでブレークポイントを使う
Section titled “CodeLLDBでブレークポイントを使う”VS Codeにrust-analyzerとCodeLLDBを入れると、fn main の上と、すべてのテストの上に、小さな Run | Debug というリンクが表示されます。行番号の左端をクリックして赤いブレークポイントの点を付け、Debug をクリックしましょう。プログラムはブレークポイントで止まり、すべての変数の中身を見たり、コードを1行ずつ実行したりできます。
何度も使える設定がほしいとき(たとえば、コマンドライン引数を渡したいとき)は、.vscode/launch.json を作ります。
{ "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug task_queue", "cargo": { "args": ["build", "--bin=task_queue"] }, "args": [], "cwd": "${workspaceFolder}" } ]}cargo の部分は、まずcargoでプログラムをビルドしてから、デバッガで起動するようCodeLLDBに指示しています。task_queue を自分のパッケージ名に置き換え、プログラムに渡す引数があれば "args" に書きます。F5 を押すと始まります。
dbg! で手早く確認する
Section titled “dbg! で手早く確認する”いつも本格的なデバッガが必要なわけではありません。dbg! マクロは、式そのもの、その値、そして書いた場所のファイル名と行番号を表示します。しかも値をそのまま返すので、コードの動きを変えずに、ほとんど何にでもかぶせて使えます。
fn apply_discount(price: u32, percent: u32) -> u32 { price - price * percent / 100}
fn main() { let prices = [120, 45, 80];
let total: u32 = dbg!(prices.iter().sum()); let final_price = dbg!(apply_discount(total, 10));
println!("10%割引後の合計: {final_price}");}実行結果:
10%割引後の合計: 221dbg! の行はどこへ行ったのでしょう? dbg! は、println! のような標準出力(stdout)ではなく、標準エラー出力(stderr、エラー用の出力先)に書き出します。そのおかげで、デバッグ用のメモと本来の出力がまざりません。ターミナルや、Playgroundの「Standard Error」の欄には、次の行も表示されます。
[src/main.rs:8:22] prices.iter().sum() = 245[src/main.rs:9:23] apply_discount(total, 10) = 221使い終わったら dbg! は消しておきましょう。これはあなた自身のためのもので、ユーザーに見せるものではありません。
毎日のコード品質チェック
Section titled “毎日のコード品質チェック”コードを健康に保つコマンドが3つあります。どれも速いので、こまめに実行しましょう。
cargo check:すばやいフィードバック
Section titled “cargo check:すばやいフィードバック”cargo check は、実行できるプログラムを作らずにコンパイルエラーだけを探します。そのため cargo build よりずっと速く終わります。数分おきに実行する開発者もたくさんいます。(エディタのrust-analyzerは、保存するたびにこれと同じようなチェックを自動で実行してくれます。)
cargo fmt:スタイルで言い争わない
Section titled “cargo fmt:スタイルで言い争わない”cargo fmt は、プロジェクトのすべてのファイルを標準のRustスタイルに書き直します。チームの誰も、スペースや改行の位置で悩む必要がなくなります。たとえば、これが
struct Player{name:String,score:u32}fn top(players:&[Player])->Option<&Player>{players.iter().max_by_key(|p|p.score)}こうなります。
struct Player { name: String, score: u32,}fn top(players: &[Player]) -> Option<&Player> { players.iter().max_by_key(|p| p.score)}ほとんどのエディタは、保存するたびにこれを実行できます。VS Codeでは「Format On Save」の設定をオンにしましょう。
cargo clippy:親切なコードレビュー
Section titled “cargo clippy:親切なコードレビュー”Clippyは、間違っている、遅い、あるいは必要以上に読みにくい、といったパターンを何百も知っています。次の小さなプログラムは、問題なく動きます。
fn main() { let tasks: Vec<&str> = vec!["ドキュメントを書く", "バグを直す"];
if tasks.len() == 0 { println!("やることはありません!"); } else { println!("{}件のタスクが待っています", tasks.len()); }}でも、cargo clippy には提案があります。
warning: length comparison to zero --> src/main.rs:4:8 |4 | if tasks.len() == 0 { | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `tasks.is_empty()` | = note: `#[warn(clippy::len_zero)]` on by defaultClippyのメッセージは英語ですが、「ゼロとの長さの比較です。is_empty を使うほうが明確です」という意味です。どの警告にも名前(ここでは len_zero)が付いていて、Clippyのリント一覧(英語)で詳しい説明を調べられます。直したものがこちらです。
fn main() { let tasks: Vec<&str> = vec!["ドキュメントを書く", "バグを直す"];
if tasks.is_empty() { println!("やることはありません!"); } else { println!("{}件のタスクが待っています", tasks.len()); }}実行結果:
2件のタスクが待っていますcargo clippy --fix を使うと、多くの提案を自動で反映できます。Clippyがあなたの状況にいつも合っているとは限りません。それでも正しいことが多いので、警告をひとつずつ読むのは、Rustらしい書き方を学ぶ近道になります。
便利なcargoの追加ツール
Section titled “便利なcargoの追加ツール”cargo のサブコマンドは誰でも追加できます。インストールには cargo install を使います。ソースコードをダウンロードしてコンパイルし、できたプログラムを ~/.cargo/bin(Windowsでは %USERPROFILE%\.cargo\bin)に置いてくれます。初日から必要なものはひとつもありませんが、知っておく価値はあります。
| ツール | 役割 | インストール | 実行 |
|---|---|---|---|
| bacon | 保存するたびに、check、clippy、テストを横のターミナルで実行し直す | cargo install --locked bacon |
bacon、bacon clippy、bacon test |
| cargo-watch | 保存するたびに好きなcargoコマンドを実行する。今も動くが更新は止まっていて、作者はbaconをすすめている | cargo install --locked cargo-watch |
cargo watch -x check |
| cargo-nextest | より速く、出力も見やすいテストランナー | cargo install --locked cargo-nextest |
cargo nextest run |
| cargo-audit | Cargo.lock を既知のセキュリティ勧告と照らし合わせる |
cargo install cargo-audit |
cargo audit |
| cargo-outdated | 新しいバージョンが出ている依存クレートを一覧にする | cargo install --locked cargo-outdated |
cargo outdated |
| cargo-edit | Cargo.toml のバージョンを上げる cargo upgrade を追加する(cargo add はすでに組み込み) |
cargo install cargo-edit |
cargo upgrade |
| cargo-expand | マクロや #[derive] が展開されたあとのコードを見せる |
cargo install cargo-expand |
cargo expand |
| cargo-binstall | コンパイルせずにビルド済みのバイナリをダウンロードするので、数秒でインストールが終わる | cargo install cargo-binstall |
cargo binstall bacon |
リンク先はどれも英語のページです。cargo install はソースからコンパイルするので、大きなツールの最初のインストールには数分かかることがあります。これは普通のことです。あとでツールをアップデートするには、同じインストールコマンドをもう一度実行します。インストールしたものを確認するには cargo install --list を実行します。プロファイラやベンチマークのような速度向上のためのツールは、パフォーマンスを見てください。
インストール不要:Rust Playground
Section titled “インストール不要:Rust Playground”Rust Playground を使うと、ブラウザでRustを実行できます。このサイトの「実際に試してみよう」ボタンも、すべてPlaygroundを開きます。ちょっとした実験や、質問するときにコードを共有したいとき、何もインストールできないパソコンで学ぶときにぴったりです。
Playgroundでできること:
- stable、beta、nightlyで、デバッグビルドまたはリリースビルドとしてコードを実行する。
- crates.ioでダウンロード数の多い上位100個のクレート(とRust Cookbookで使われているクレート、およびそれらの依存クレート)を使う。たとえば
serde、rand、regex、tokioなど。 - Tools メニューから
rustfmtとClippyを実行する。 - コードをリンクにして共有する。
Playgroundでできないこと:
- 複数のファイルを使う。
Cargo.tomlもないので、ほかのクレートやバージョンを選べません。 - ネットワークにアクセスする。Webページをダウンロードするコードは失敗します。
- 自分のファイルを扱う、長時間動かす。実行時間とメモリには制限があります。
- 対話的なプログラムを快適に動かす。プログラムの実行中は小さな入力欄に文字を打てますが、ちょっとしたテスト以上のことには使いにくいです。このサイトの例は入力を読み込まないので、ワンクリックで実行できます。
物足りなくなったら、cargo new でローカルのプロジェクトを作りましょう。1分もかかりません。
新しいマシン用のスタートチェックリスト
Section titled “新しいマシン用のスタートチェックリスト”新しいパソコンをセットアップするときは、このリストを一度通してみてください。
- OSの前提条件をインストールする:Visual StudioのC++ツール(Windows)、
xcode-select --install(macOS)、build-essential/gcc(Linux)。 - rustup.rs からRustをインストールし、ターミナルを新しく開き直す。
- 確認する:
rustc --versionとcargo --version。 - ふだん使うツールがそろっているか確かめる:
rustup component add clippy rustfmt。 - rust-analyzerが使えるエディタを入れる。VS Codeなら、rust-analyzerとCodeLLDBの拡張機能を追加する。
- エディタで保存時のフォーマットをオンにする。
cargo new helloでテスト用のプロジェクトを作り、その中でcargo run、cargo clippy、cargo fmtを実行する。- 1〜2か月ごとに
rustup updateを実行するよう、リマインダーを設定する。 - お好みで:コードを書きながらすぐにフィードバックがほしければ
cargo install --locked bacon。
1. 道具箱をチェックする
Section titled “1. 道具箱をチェックする”自分のマシンで、rustup show、cargo clippy --version、cargo fmt --version を順に実行し、どれも「not installed」(インストールされていない)と言われないことを確かめましょう。次に、オフラインの標準ライブラリのドキュメントを開いて、Vec のページを探してください。ヒント: rustup doc には、型のフルパスのようなトピックを渡せます。
解答を見る
rustup showcargo clippy --versioncargo fmt --versionrustup doc std::vec::Vec--version の付いたコマンドは、それぞれバージョン番号を表示します。代わりにエラーが出たら、足りないものを rustup component add clippy または rustup component add rustfmt でインストールしてください。最後のコマンドは、Vec のページをディスクから直接ブラウザで開きます。rust-docs がインストールされていないと言われたら、先に rustup component add rust-docs を実行しましょう。
2. Clippyに教えてもらう
Section titled “2. Clippyに教えてもらう”新しいプロジェクトを作り、Clippyのセクションにあるタスクのプログラムの最初のバージョンを src/main.rs に貼り付けます。cargo clippy を実行して警告を読み、Clippyに直してもらいましょう。ヒント: 提案を自動で反映するフラグがあります。
解答を見る
cargo new task_queuecd task_queue# プログラムを src/main.rs に貼り付けてから:cargo clippycargo clippy --fix --allow-dirtycargo clippy最初の cargo clippy で len_zero の警告が出ます。cargo clippy --fix は、tasks.len() == 0 を tasks.is_empty() に書き換えます。--allow-dirty フラグを付けると、まだgitにコミットしていないファイルも書き換えられるようになります。最後の実行では、警告は何も出ません。
- rustup はRustのインストールとアップデート、ツールチェーンの切り替えをします。cargo はビルド、実行、テスト、クレートの追加をします。rustc はその裏で動くコンパイラです。
- どのOSでも、まずリンカが必要です。WindowsならVisual StudioのC++ツール、macOSなら
xcode-select --install、Linuxならbuild-essentialかgccです。 - 基本は stable を使いましょう。
rust-toolchain.tomlはプロジェクトでバージョンを固定する必要があるときだけ使い、nightlyを一度だけ使いたいときはcargo +nightlyを使います。 - rust-analyzer が使えるエディタを選びましょう。rust-analyzerとCodeLLDBを入れたVS Codeが、いちばんよくある組み合わせです。
cargo checkはこまめに、cargo fmtとcargo clippyはコミットの前に毎回実行します。手早く確認するならdbg!、手ごわいバグにはデバッガを使います。- Playground は実験や共有に最適です。ただし、ファイルはひとつだけ、ネットワークは使えず、使えるクレートは人気のものだけです。
理解度チェック
Section titled “理解度チェック”理解度チェック
1. stableと並べてnightlyツールチェーンをインストールするには、どのツールを使いますか?
2. Windowsで、リンカが見つからずにビルドが失敗しました。足りないものとして、いちばん可能性が高いのはどれですか?
3. dbg! は出力をどこに書き出しますか?
4. Rust Playgroundで「できない」ことはどれですか?
スコア: 0 / 4
さらに詳しく
Section titled “さらに詳しく”- Rustをインストール — rust-lang.org:すべてのプラットフォーム向けの公式インストーラーと、Windows、
PATH、アンインストールについての注意点。 - The rustup book(英語):ツールチェーン、チャンネル、コンポーネント、プロファイル、
rust-toolchain.toml、クロスコンパイルのターゲット。 - The Cargo Book(英語):
cargo installや各コマンドのオプションなど、cargoのすべて。 - rust-analyzer manual(英語):VS Code、Neovim、Helix、Emacsなどでのrust-analyzerのセットアップと、すべての設定。
- Clippy documentation(英語):Clippyの実行方法と設定方法。リントの全一覧と、それぞれの意味へのリンクもあります。