複数のプロジェクトがあるときに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が効かなくなってしまった。

原因と対処方法

これはproject1Cargo.tomlpackage.namesampleのままであったことが原因。 これによりproject2sampleの一部として扱われてしまい、rust-analyzerからproject2Cargo.tomlが無視されてしまった様子。

以下のようにproject1Cargo.tomlpackage.nameproject1に変更することで、project2Cargo.tomlが正しく認識されるようになった。

[package]
name = "project1"
...

更に階層が深い場合

sampleディレクトリ内にproject1project2がある場合は、project1Cargo.tomlpackage.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"",
    ]
}