如何为Rust工作区中的单个包生成Cargo.lock文件?
解决cargo publish时Cargo.lock被build.rs修改的报错
问题重现
执行cargo publish时出现以下错误:
error: Source directory was modified by build.rs during cargo publish. Build scripts should not modify anything outside of OUT_DIR.
Added: {workspace_dir}/target/package/{package_name}-{version}/Cargo.lockTo proceed despite this, pass the
--no-verifyflag.
解决方案
1. 阻止发布时包含Cargo.lock(优先级次选,适合无二进制库)
对于无二进制文件的库,可直接在子包的Cargo.toml中添加配置,排除Cargo.lock文件:
[package] # 保留原有包配置 exclude = ["Cargo.lock"]
也可以在发布时临时指定排除:
cargo publish --exclude Cargo.lock
2. 单独生成单包的Cargo.lock
要生成仅属于当前子包的锁文件,需进入子包目录,使用--no-workspace参数绕过工作区配置:
cd ./path/to/your/subpackage cargo generate-lockfile --no-workspace --lockfile-path ./Cargo.lock
生成后再执行cargo publish,此时打包目录中的Cargo.lock会和子包目录的一致,避免被判定为build脚本新增的文件。
3. 修复build.rs的文件操作(根源解决)
报错的核心原因是build.rs在OUT_DIR之外生成了文件。检查你的build.rs代码,移除任何生成/修改Cargo.lock的逻辑,确保所有文件操作都限定在OUT_DIR目录下:
use std::env; use std::fs::File; use std::path::Path; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("generated_file.rs"); // 仅在OUT_DIR下进行文件操作 let mut file = File::create(dest_path).unwrap(); // ... 其他逻辑 }
4. 临时绕过验证(不推荐长期使用)
如果以上方案都无法快速生效,可临时使用--no-verify参数跳过发布验证:
cargo publish --no-verify
内容的提问来源于stack exchange,提问作者carver
相关产品推荐
相关产品推荐

