使用include_str的已发布Rust包未指定--path无法安装问题
问题原因及解决方案
错误原因
核心问题是你发布到crates.io的包中没有包含resources/tla-unicode.csv文件,导致cargo install从crates.io拉取包编译时,build.rs找不到源文件:
- Cargo默认仅自动包含
src/、Cargo.toml、README*、LICENSE*等标准文件,自定义的resources/目录不会被纳入发布包。 - 本地开发/打包时,你拥有完整的项目目录,
resources文件存在,所以所有本地操作(cargo build/package/--path安装)都能正常执行;但从crates.io下载的包缺少该目录,build.rs执行std::fs::copy时触发NotFound错误。 - 你提到手动从crates.io下载包后
--path安装正常,大概率是误操作(如下载了GitHub源码包而非crates.io的发布包)。
另外,你已经通过include_str!将csv内容嵌入二进制,build.rs中的文件复制操作其实是多余的,这进一步放大了问题。
解决方案
方案1:移除多余的build.rs复制逻辑(推荐)
既然已经用include_str!把csv内容编译进程序二进制,完全不需要再复制文件到target目录。修改build.rs仅保留监听文件变更的逻辑即可:
fn main() { println!("cargo:rerun-if-changed=resources/tla-unicode.csv"); }
这样既保留了文件变更时自动重新编译的能力,又避免了依赖外部文件路径的问题。
方案2:确保resources目录被包含到发布包(如果必须保留复制逻辑)
在项目根目录的Cargo.toml中添加include字段,明确指定要包含的文件:
include = [ "src/**/*", "resources/**/*", "Cargo.toml" ]
执行cargo package --list验证包内容,确认resources/tla-unicode.csv在列表中后,重新执行cargo publish更新crates.io上的包。
内容的提问来源于stack exchange,提问作者user2852699
相关产品推荐
相关产品推荐

