DEBUG.WIKI
雨云;给项目一台云服务器
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →

换目录运行 Cargo 后缓存跑偏:CARGO_TARGET_DIR 按当前目录解析

同一个 --manifest-path 从不同目录调用却生成多套 target,检查相对 CARGO_TARGET_DIR 的基准,以及配置文件路径与环境变量的区别。

在项目根目录运行构建时,产物进入 target/container;换到上一级目录,再加 --manifest-path 指向同一项目,产物却出现在另一套目录。若设置的是相对 CARGO_TARGET_DIR,这是需要先确认的路径规则。

CARGO_TARGET_DIR 中的相对路径以当前工作目录为基准。--manifest-path 选择包清单,不会先把进程切换到清单目录。例如:

CARGO_TARGET_DIR=target/container cargo build --manifest-path=app/Cargo.toml

从父目录执行时,这里的 target/container 位于父目录,不是 app/target/container。这个区别也会影响容器挂载、CI 缓存命中和多个项目之间的产物隔离。

先选定目录的归属

需要由外部脚本统一调度时,可以传入已经解析好的绝对路径。以下路径仅为示例,应替换为本机实际项目位置:

CARGO_TARGET_DIR=/workspace/app/target/container cargo build --manifest-path=/workspace/app/Cargo.toml

容器内外的绝对路径可能不同,不能直接把宿主路径照搬进容器。确保目标目录有相应写权限、映射到预期卷,并且容器与宿主没有同时向同一套不兼容的构建产物写入。

若目录策略属于项目,可放进项目根的 .cargo/config.toml:

[build]
target-dir = "target/container"

对常规的项目根 .cargo/config.toml,这会按配置文件的路径规则解析到项目目录。若配置放在全局位置,或通过其他方式传入,基准也跟着变;不要把配置文件中路径的规则与环境变量混为一谈。还要检查外部 CARGO_TARGET_DIR 是否覆盖了这项设置。

配置文件从调用目录及其父级查找。在项目父目录运行并只使用 --manifest-path,不能假定 Cargo 会自动读取项目内部的 .cargo。需要从项目根调用时,就让脚本显式切换工作目录,并保留失败退出处理。

不要拿中间目录模板替换最终产物目录

build.build-dir 与 build.target-dir 用途不同。支持 {workspace-root} 的中间产物目录配置,不表示任意版本都支持在 CARGO_TARGET_DIR 中使用同样的模板。未经确认的占位符可能变成字面目录名。

修改前记录原目录和缓存策略。修正路径后,从两种原有调用位置各做一次构建,检查最终产物、缓存保存路径和容器卷是否一致。已有旧目录先保留,确认没有其他任务使用后再按项目策略清理;无需为调整路径删掉全部 Cargo 注册表缓存。