Tauri プロジェクトは TypeScript と Rust が 1 つのリポジトリに同居するため、VS Code 側も両方の言語サポートを揃える必要があります。拡張機能の選定に加えて、チームで共有する .vscode/extensions.json、rust-analyzer を快適にする settings.json、console.log では追えない Rust 側の問題にブレークポイントを張る launch.json / tasks.json をまとめます。
1. 入れる拡張機能
| 拡張 | ID | 役割 |
|---|---|---|
| rust-analyzer | rust-lang.rust-analyzer | Rust の補完・型表示・定義ジャンプ・保存時 cargo check |
| Tauri | tauri-apps.tauri-vscode | tauri.conf.json のスキーマ補完と検証、コマンドパレットから dev / build |
| CodeLLDB | vadimcn.vscode-lldb | Rust バイナリのデバッガ (macOS / Linux) |
| C/C++ | ms-vscode.cpptools | Windows で MSVC デバッガ (cppvsdbg) を使う場合 |
| Even Better TOML | tamasfe.even-better-toml | Cargo.toml のハイライトと補完 |
create-tauri-app が生成する .vscode/extensions.json には最初の 2 つだけが書かれています。増やしてリポジトリに含めておくと、クローンした人に「推奨拡張をインストールしますか」と通知されます。
{
"recommendations": [
"tauri-apps.tauri-vscode",
"rust-lang.rust-analyzer",
"vadimcn.vscode-lldb",
"tamasfe.even-better-toml"
]
}
2. settings.json の推奨設定
.vscode/settings.json (プロジェクト単位) に置きます。
{
"rust-analyzer.linkedProjects": ["./src-tauri/Cargo.toml"],
"rust-analyzer.check.command": "clippy",
"rust-analyzer.cargo.targetDir": true,
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer",
"editor.formatOnSave": true
},
"files.watcherExclude": {
"**/src-tauri/target/**": true
}
}
linkedProjects: Cargo プロジェクトがワークスペース直下ではなくsrc-tauri/にあることを明示します。通常は自動検出されますが、モノレポや複数フォルダを開いたときに workspace を見失うのを防げます。check.command: "clippy": 保存時にcargo clippyを走らせ、Tauri コマンドでありがちな&String引数などの指摘を早めに受け取ります。cargo.targetDir: true: rust-analyzer 専用のtarget/rust-analyzer/を使い、npm run tauri devのコンパイルとtarget/のロックを奪い合わないようにします。ディスクは倍使いますが、保存のたびに dev の再ビルドが待たされる問題が消えます。files.watcherExclude:target/は数 GB になるので監視対象から外します。
3. launch.json で Rust 側をデバッグする
tauri dev の代わりに VS Code のデバッガから Cargo を直接呼びます。Tauri CLI を経由しないため、beforeDevCommand (Vite の起動) はタスクとして自分で用意します。
.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "ui:dev",
"type": "shell",
"isBackground": true,
"command": "npm",
"args": ["run", "dev"],
"problemMatcher": {
"pattern": { "regexp": "^$" },
"background": {
"activeOnStart": true,
"beginsPattern": "VITE",
"endsPattern": "Local:"
}
}
}
]
}
problemMatcher.background は「Vite が Local: を出力したら準備完了」と VS Code に伝えるものです。公式の例にはありませんが、これがないと VS Code が「タスクの完了を追跡できません」と毎回確認してきます。
.vscode/launch.json (macOS / Linux: CodeLLDB)
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Tauri Development Debug",
"cargo": {
"args": ["build", "--manifest-path=./src-tauri/Cargo.toml", "--no-default-features"]
},
"preLaunchTask": "ui:dev"
}
]
}
Windows: MSVC デバッガ
CodeLLDB は MSVC の PDB を読み切れないことがあるため、Windows では ms-vscode.cpptools の cppvsdbg を使います。この構成はビルドを行わないので、事前に cargo build --manifest-path src-tauri/Cargo.toml を済ませておきます。
{
"name": "Launch App Debug",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceRoot}/src-tauri/target/debug/my-app.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "ui:dev"
}
program の exe 名は Cargo.toml の [package] name です。
動作確認
src-tauri/src/lib.rsのgreet関数の行番号左をクリックしてブレークポイントを置く。- 「実行とデバッグ」から「Tauri Development Debug」を選んで F5。
- ターミナルに Vite が起動し、続いて Cargo のビルドが走ってウィンドウが開く。
- 画面で名前を入力して Greet を押すと
greetの行で停止し、nameの値がサイドバーに表示される。
よくあるエラーと対処法
rust-analyzer が failed to discover workspace という趣旨の通知を出す
VS Code で開いたフォルダ直下に Cargo.toml がないときに出ます。rust-analyzer.linkedProjects を設定するか、src-tauri/ を追加のワークスペースフォルダとして開きます。
保存するたびに tauri dev が Blocking waiting for file lock on build directory で待たされる
rust-analyzer の cargo check と Tauri の cargo build が同じ target/ を奪い合っています。rust-analyzer.cargo.targetDir: true で分離してください。
ブレークポイントが Unverified のまま止まらない
--release でビルドしたバイナリはデバッグ情報が削られています。開発用の構成 (--release なし) を使います。[profile.dev] で debug = 0 にしている場合も戻します。
注意点
- デバッガから起動した場合、
tauri devの Rust ファイル監視 (自動再ビルド) は働きません。Rust を書き換えたら一度停止して再度 F5 です。 preLaunchTaskで起動した Vite はデバッグ終了後も動き続けます。ターミナルタブから手動で止めてください。tauri.conf.jsonは先頭の"$schema": "https://schema.tauri.app/config/2"があれば、Tauri 拡張なしでも VS Code 標準の JSON 検証が効きます。
