You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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.lock

To proceed despite this, pass the --no-verify flag.

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:47:13