05月27, 2020

解决 zsh 环境 Rust VSCode 扩展报错的问题

装完 Rust 环境以及在 VSCode 装完 RustRustfmtvscode-rust-syntax 等之类的扩展后,打开 main.rs 后会发现 vscode 在右下角提示错误。

从错误信息上看是 rustup 没有安装,但实际上已经安装,并且相关的命令执行也没有问题。搜索了一些解决方案(如:配置 settings.json) 也未能解决问题。

rls-vscode 扩展

具体的错误信息是在 rls-vscode 里报出来的,具体见文件:https://github.com/rust-lang/rls-vscode/blob/fc2eb5cdacd9bc6e6d3ad8cb69a97952183a897b/src/rustup.ts#L106

async function hasToolchain({ channel, path }: RustupConfig): Promise<boolean> {
  // In addition to a regular channel name, also handle shorthands e.g.
  // `stable-msvc` or `stable-x86_64-msvc` but not `stable-x86_64-pc-msvc`.
  const abiSuffix = ['-gnu', '-msvc'].find(abi => channel.endsWith(abi));
  const [prefix, suffix] =
    abiSuffix && channel.split('-').length <= 3
      ? [channel.substr(0, channel.length - abiSuffix.length), abiSuffix]
      : [channel, undefined];
  // Skip middle target triple components such as vendor as necessary, since
  // `rustup` output lists toolchains with a full target triple inside
  const matcher = new RegExp([prefix, suffix && `.*${suffix}`].join(''));
  try {
    const { stdout } = await exec(`${path} toolchain list`);
    return matcher.test(stdout);
  } catch (e) {
    console.log(e);
    window.showErrorMessage(
      'Rustup not available. Install from https://www.rustup.rs/',
    );
    throw e;
  }
}

扩展里会判断当前下环境下是否有安装 Rustup 等工具库,为什么明明已经安装了但这里找不到呢?怀疑是环境变量 $PATH 出了问题。

通过 Terminal -> New Terminal 然后执行 rustup 命令确实找不到,如:

通过 echo $PATH 查看,也确实没有 $HOME/.cargo/bin 目录。

zsh 下配置

知道了是 $PATH 缺少对应的目录后就很简单了,只要在 .zshrc 下增加这个路径即可:

export PATH="$HOME/.cargo/bin:$PATH"

然后执行下 source .zshrc 让其生效。

更改 Rust-client: Engine

默认的分析是通过 rls 完成的,测试发现效果不太好。除了 rls 外,还有 rust-analyzer 可以用。

更改也比较简单,找到 Rust 扩展,打开配置选项,进行更改即可:

image.png

本文链接:http://www.welefen.com/post/fix-rust-vscode-extension-error-in-zsh-env.html?utm_source=tuicool&utm_medium=referral

-- EOF --