为何我的Rust Rocket项目每次修改都会重新编译依赖?
问题描述
我正在使用Rust构建基于Rocket的Web服务器,每次做微小修改(比如添加一行println!())后运行cargo run,都会重新编译所有Rocket相关依赖,而非仅编译我的项目代码。按Rust的增量编译特性,正常情况下不应出现这种情况。
操作系统:Ubuntu 22
运行cargo run时会先出现以下提示并等待数秒:
Blocking waiting for file lock on build directory
随后开始编译大量依赖,最终才编译我的项目,日志示例如下:
Compiling version_check v0.9.4 Compiling libc v0.2.137 Compiling cfg-if v1.0.0 ...(省略大量依赖编译日志) Compiling samson-lol v0.1.0 (/home/<me>/dev/samson-lol)
而我期望的输出应该只有:
Compiling samson-lol v0.1.0 (/home/<me>/dev/samson-lol)
解决方法
1. 确认增量编译配置
检查Cargo.toml的开发环境配置,确保增量编译处于开启状态(默认开启,可显式声明避免意外关闭):
[profile.dev] incremental = true
2. 清理并重建缓存
缓存损坏可能导致重复编译,执行以下命令清理缓存后重新构建:
cargo clean cargo run
后续的增量编译应恢复正常。
3. 释放构建目录锁
Blocking waiting for file lock提示说明可能有其他Cargo进程未正常终止,占用了构建目录。执行以下命令终止相关进程:
pkill -f cargo pkill -f samson-lol # 替换为你的项目二进制文件名
4. 调整Rocket依赖版本
你当前使用的是Rocket 0.5.0-rc.2候选版本,这类版本可能存在增量编译兼容性问题。建议升级到稳定版,同时确保依赖版本固定:
[dependencies] rocket = "0.5.0" # 使用稳定版而非候选版本
5. 修复目录权限
确保当前用户对target目录拥有完整读写权限,权限不足会导致缓存无法正常保存,进而触发重复编译:
sudo chown -R $USER:$USER target/
内容的提问来源于stack exchange,提问作者Jonathan Samson
相关产品推荐
相关产品推荐

