複数のプロジェクトがあるときにrust-analyzerが効かない場合に実施したこと
VSCodeのWorkspace内に複数のRustプロジェクトが存在しているときにrust-analyzerによる補完やジャンプが効かなかった際の原因と対処方法のメモ。
環境
- VSCode: 1.78.2
- rust: 1.69.0
- rust-analyzer: v0.3.1524
症状
最初に以下のような構成でcargo initしてプロジェクトを作成していた。
sample
├── Cargo.toml
└── src
└── main.rs
その後、sampleディレクトリ内に新しく別のプロジェクトを作成したくなったため、以下のような構成に変更した。
元々あったプロジェクトはproject1内に移動している。
また、project2内でcargo initしてプロジェクトを初期構築している。
sample
├── project1
│ ├── Cargo.toml
│ └── src
│ └── main.rs
└── project2
├── Cargo.toml
└── src
└── main.rs
この状態でsampleをVSCodeで開くと、project1のプロジェクト内でしかrust-analyzerが効かなくなってしまった。
原因と対処方法
これはproject1のCargo.tomlのpackage.nameがsampleのままであったことが原因。
これによりproject2もsampleの一部として扱われてしまい、rust-analyzerからproject2のCargo.tomlが無視されてしまった様子。
以下のようにproject1のCargo.tomlのpackage.nameをproject1に変更することで、project2のCargo.tomlが正しく認識されるようになった。
[package]
name = "project1"
...
更に階層が深い場合
sampleディレクトリ内にproject1とproject2がある場合は、project1のCargo.tomlのpackage.nameを変更することで対処できるが、以下のように更に階層が深いとうまく行かなかった。
sample
├── project1
│ ├── Cargo.lock
│ ├── Cargo.toml
│ └── src
│ └── main.rs
└── project2
└── project2-1
├── Cargo.toml
└── src
└── main.rs
対処方法1: Cargoのワークスペースを使う方法
Cargoのワークスペースを設定するとrust-analyzerもうまく効いてくれた。
sample直下に以下のようなCargo.tomlを作成するとワークスペースとして認識される。
[workspace]
members = [
"project1",
"project2/*",
]
対処方法2: linkedProjectsを設定する方法
rust-analyzer.linkedProjectsを設定することで、ワークスペースを使わずに対処できる。
.vscode/settings.jsonに以下のように設定する。
{
"rust-analyzer.linkedProjects": [
"./project1/Cargo.toml",
"./project2/project2-1/Cargo.toml"",
]
}