vscode中cargo build卡住或报错,主因是rust-analyzer未继承代理且镜像源配置不完整:需在~/.cargo/config.toml中显式配置[http]和[https]代理,并在vscode settings.json中通过"rust-analyzer.server.extraenv"注入http_proxy/https_proxy环境变量,同时重启rust-analyzer服务。

VSCode 里 cargo build 卡住或报错,根本不是代码问题
绝大多数情况是 VSCode 启动的 cargo 进程没走你本地配好的代理,或者镜像源配置被忽略。它不读系统环境变量,也不继承终端里的 export https_proxy=...,更不会自动用你 Clash 或 Surge 的全局模式——除非你手动喂给它。
cargo config.toml 里 proxy 配置必须显式写进 [http] 和 [https]
很多人只改了镜像源,但网络不通时镜像也没用。如果公司网络或校园网需要代理才能出外网,config.toml 必须补上这两段:
[http] proxy = "http://127.0.0.1:7890" [https] proxy = "http://127.0.0.1:7890"
-
proxy值必须带http://前缀,不能只写127.0.0.1:7890 - Clash/Shadowrocket 默认 HTTP 代理端口是
7890,HTTPS 端口一般不开放,所以[https]段也填http://协议即可(cargo 内部会自动适配) - 如果代理需要认证,格式为
http://user:pass%40word@127.0.0.1:7890,密码里的@必须 URL 编码成%40 - Windows/macOS 默认绕过
localhost,所以别用localhost:7890,统一用127.0.0.1:7890
VSCode 的 Rust 插件根本不用系统代理,得靠 rust-analyzer 启动参数
即使你终端里 curl -x http://127.0.0.1:7890 https://crates.io 能通,VSCode 里 rust-analyzer 启动 cargo 时仍可能直连失败。原因在于 rust-analyzer 是独立进程,它启动 cargo 不走 shell 环境变量。
解决办法:在 VSCode 的 settings.json 里加一条启动参数:
"rust-analyzer.cargo.loadOutDirsFromCheck": true,
"rust-analyzer.server.extraEnv": {
"HTTP_PROXY": "http://127.0.0.1:7890",
"HTTPS_PROXY": "http://127.0.0.1:7890",
"NO_PROXY": "localhost,127.0.0.1"
}
-
server.extraEnv是 rust-analyzer 唯一可靠的环境注入方式 -
NO_PROXY加上localhost,127.0.0.1防止它把代理请求发给自己 - 改完后必须重启 rust-analyzer(命令面板执行
Rust Analyzer: Restart Server),不是重启 VSCode
镜像源和代理同时配错,cargo 会静默 fallback 到 crates.io
比如你在 config.toml 里写了:
[source.crates-io] replace-with = 'tuna' [source.tuna] registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
但清华源用的是 HTTPS,而你的代理只开了 HTTP 端口——cargo 就会卡在 git clone 阶段,错误不明显,只显示 “Updating crates.io index…” 一直不动。
- 遇到这种卡住,先运行
cargo -v build看详细日志,重点找git fetch行 - 清华、中科大镜像都支持
git://协议(无需 TLS),可改成:registry = "git://mirrors.tuna.tsinghua.edu.cn/crates.io-index" - 中科大源还支持
rsync://,但 cargo 不认,别乱试 - 如果用的是企业私有 registry,确保
replace-with指向的 source 名和[source.xxx]完全一致,大小写敏感
最麻烦的其实是 cargo 在后台悄悄换源又不报错,等你发现时已经下了半拉损坏的包。验证是否真走镜像,最快方法是删掉 ~/.cargo/registry,再跑一次 cargo build,看日志里 fetch 的 URL 是不是你配的那个域名。











