如何让同一Crate内的二进制文件访问库模块,禁止外部Crate访问?
解决方案:在Cargo项目内共享私有模块(不暴露给外部Crate)
当然可以实现你的需求——问题根源在于:你配置的lib和bin是两个独立的Rust crate,哪怕它们在同一个Cargo项目里。pub(crate)的可见性规则是「仅对当前所在的crate内部开放」,所以二进制crate自然访问不了lib crate里的keys模块。
下面是两种可行的解决方式:
方案一:用pub(package)修饰符(推荐)
Rust 1.38及以上版本支持pub(package)这个可见性修饰符,它专门用来实现「同一个Cargo包内所有crate可见,外部包完全隐藏」的需求,完全匹配你的场景。
只需要修改lib.rs里的模块声明:
pub(package) mod keys;
之后在main.rs里就能正常使用:
use lib::keys;
这样既不会把keys模块暴露给任何外部依赖,又能让项目里的lib和二进制代码都自由访问它。
方案二:把二进制代码整合进lib crate
如果不想用pub(package),可以把二进制入口逻辑合并到lib crate里,让所有代码处于同一个crate中,这样pub(crate)的可见性就能覆盖全部代码:
- 删除
Cargo.toml里的[[bin]]配置块。 - 调整代码结构:
- 在
lib.rs里添加:pub(crate) mod keys; mod main; fn main() { main::run(); // 调用二进制入口逻辑 } - 把
src/main.rs的内容改成:pub(crate) fn run() { // 原main函数的代码,直接用crate::keys访问模块 let example_key = crate::keys::YourStruct::new(); // ... 其他逻辑 }
- 在
- 运行
cargo run时,Cargo会自动识别lib里的main函数作为程序入口。
这种方式下,所有代码都在同一个crate内,pub(crate)的可见性规则生效,同时外部crate完全看不到keys模块。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

