コンテンツにスキップ

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を始めるのインストール手順に進みましょう。

Rustをインストールしたら、その管理には rustup を使います。Rustの新しい安定版は6週間ごとに出るので、アップデートはふだんの習慣にしましょう。

Terminal window
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-gnu
active because: it's the default toolchain

ツールチェーン(toolchain)とは、rustc、cargo などをひとそろいにしたものです。Rustには3つのリリースチャンネルがあります。

チャンネル どんなものか 使う場面
stable 公式リリース。6週間ごとに出る ほぼいつもこれ。あなたがほしいのはこれです
beta 次のstableリリースで、テスト中のもの 次のリリースの前に、自分のプロジェクトが動くか確かめたいとき
nightly 毎晩ビルドされ、実験的な機能を含む ツールやクレートに求められたとき、または新機能を試したいとき

複数のツールチェーンを並べてインストールできます。

Terminal window
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を使えば十分です。

コンポーネント(component)は、ツールチェーンに追加できる部品です。ターゲット(target)を使うと、別の種類のマシン向けにコンパイルできます。

Terminal window
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に必要なものです。

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を使うなら、次の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! マクロは、式そのもの、その値、そして書いた場所のファイル名と行番号を表示します。しかも値をそのまま返すので、コードの動きを変えずに、ほとんど何にでもかぶせて使えます。

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%割引後の合計: 221
▶ 実際に試してみよう

dbg! の行はどこへ行ったのでしょう? 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! は消しておきましょう。これはあなた自身のためのもので、ユーザーに見せるものではありません。

コードを健康に保つコマンドが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 default

Clippyのメッセージは英語ですが、「ゼロとの長さの比較です。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 のサブコマンドは誰でも追加できます。インストールには 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。

自分のマシンで、rustup show、cargo clippy --version、cargo fmt --version を順に実行し、どれも「not installed」(インストールされていない)と言われないことを確かめましょう。次に、オフラインの標準ライブラリのドキュメントを開いて、Vec のページを探してください。ヒント: rustup doc には、型のフルパスのようなトピックを渡せます。

解答を見る
Terminal window
rustup show
cargo clippy --version
cargo fmt --version
rustup doc std::vec::Vec

--version の付いたコマンドは、それぞれバージョン番号を表示します。代わりにエラーが出たら、足りないものを rustup component add clippy または rustup component add rustfmt でインストールしてください。最後のコマンドは、Vec のページをディスクから直接ブラウザで開きます。rust-docs がインストールされていないと言われたら、先に rustup component add rust-docs を実行しましょう。

新しいプロジェクトを作り、Clippyのセクションにあるタスクのプログラムの最初のバージョンを src/main.rs に貼り付けます。cargo clippy を実行して警告を読み、Clippyに直してもらいましょう。ヒント: 提案を自動で反映するフラグがあります。

解答を見る
Terminal window
cargo new task_queue
cd task_queue
# プログラムを src/main.rs に貼り付けてから:
cargo clippy
cargo clippy --fix --allow-dirty
cargo 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 は実験や共有に最適です。ただし、ファイルはひとつだけ、ネットワークは使えず、使えるクレートは人気のものだけです。

理解度チェック

1. stableと並べてnightlyツールチェーンをインストールするには、どのツールを使いますか?

2. Windowsで、リンカが見つからずにビルドが失敗しました。足りないものとして、いちばん可能性が高いのはどれですか?

3. dbg! は出力をどこに書き出しますか?

4. Rust Playgroundで「できない」ことはどれですか?

スコア: 0 / 4

  • 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の実行方法と設定方法。リントの全一覧と、それぞれの意味へのリンクもあります。