😎

Rust 1.42.0 環境で rust-analyzer を動作させる

2022/06/18に公開5

現象

  • Rust 1.42.0 環境で、rust-analyzer が動作しない

以下は vim-lsp が取得した rust-analyzer のエラーメッセージ。(改行は筆者が挿入したもの)

rust-analyzer: error: rust-analyzer failed to load workspace: Failed to find sysroot for Cargo.toml file \${ワークスペース}/atcoder/abc251/Cargo.toml.
Is rust-src installed?: can't load standard library from sysroot^@\$HOME/.rustup/toolchains/1.42.0-x86_64-unknown-linux-gnu^@(discovered via `rustc --print sysroot\\`)^@try installing the Rust source the same way you installed rustc

結論

# 自己責任で。
cd $HOME/.rustup/toolchains/1.42.0-x86_64-unknown-linux-gnu/lib/rustlib/src/rust
ln -sv src library

背景

  • 私は AtCoder に Rust で参加している
  • AtCoder の Rust環境は 1.42.0 である
  • 手元の環境も WSL上の Ubuntu で、 1.42.0 の環境としている
  • rust-analyzer は vim-lsp-settings によってインストールしたものを使っている
    • 執筆時: rust-analyzer 5d5bbec9b 2022-05-09 stable
  • rust-analyzerrust-src を見つけられないとエラーを吐くようになった

原因

対処方針

  • 差分によると、 lib/rustlib/src/rust/src を参照するか、 lib/rustlib/src/rust/library を参照するかの違いでしかない
  • 自己責任において、シンボリックリンクを貼って解決とした
GitHubで編集を提案

Discussion

YajamonYajamon

とりあえずエラーメッセージは出なくなったし、LSPとして利用できている状態。
より複雑な問題が発生したらそれはその時対応で。

bouzuyabouzuya

記事と直接の関係はないですが、 VS Code の rust-analyzer 拡張 (rust-lang.rust-analyzer) の場合は .vscode/settings.json{"rust-analyzer.server.path":"/path/to/rust-analyzer"} とすることでこの問題を回避できます。

YajamonYajamon

その場合、 /path/to/rust-analyzer には現象の発生しないバージョンの rust-analyzer が指定される認識でよいでしょうか。

Mizar/みざーMizar/みざー

Windows PowerShell 環境での設定例:

rustup toolchain add 1.42.0-x86_64-pc-windows-msvc
rustup +1.42.0-x86_64-pc-windows-msvc component add rust-src
(Join-Path $env:USERPROFILE ".rustup\toolchains\1.42.0-x86_64-pc-windows-msvc\lib\rustlib\src\rust")|ForEach-Object{New-Item -Type Junction (Join-Path $_ library) -Value (Join-Path $_ src)}
rustup toolchain add 1.42.0-x86_64-pc-windows-gnu
rustup +1.42.0-x86_64-pc-windows-gnu component add rust-src
(Join-Path $env:USERPROFILE ".rustup\toolchains\1.42.0-x86_64-pc-windows-gnu\lib\rustlib\src\rust")|ForEach-Object{New-Item -Type Junction (Join-Path $_ library) -Value (Join-Path $_ src)}