Rust中多二进制可执行文件共享私有内部代码且避免对外暴露的解决方案咨询
解决方案:使用Rust 1.71+的
pub(package)访问修饰符 这正是Rust 1.71.0引入的pub(package)访问控制符要解决的场景!它允许同一个package内的所有目标(包括库、二进制可执行文件、示例等)访问指定的项,但会完全隐藏给外部依赖的crate。完美匹配你需要的「仅对当前package内的bin可见,对外隐藏」的需求。
具体步骤:
- 确保你的Rust版本≥1.71.0(可以通过
rustup update升级) - 调整你的代码结构:
- 在
src/lib.rs中保留对common模块的私有声明:// src/lib.rs mod common; // 模块本身是私有的,仅lib内部可见,但里面的pub(package)项可以被同package的bin访问 - 在
src/common.rs中,将需要共享的函数标记为pub(package):// src/common.rs pub(package) fn cant_leak_this_function() { // 你的私有共享逻辑 }
- 在
- 在二进制文件中引用这些函数:
在my-bin-1/src/main.rs和my-bin-2/src/main.rs里,通过你的crate名称引入:
(把// src/bin/my-bin-1/main.rs use your_crate_name::common::cant_leak_this_function; fn main() { cant_leak_this_function(); }your_crate_name替换成你在Cargo.toml中name字段的值)
为什么这比你之前的方案更好:
- 完全符合Rust的访问控制规范,不需要使用
#[path]这类hack手段 - rust-analyzer可以正确识别代码的引用关系,不会出现误报的「未使用」错误
- 严格保证代码不对外暴露:外部crate即使依赖你的库,也无法访问
pub(package)标记的项 - 保持项目结构的清晰性,不需要在
src/bin下额外创建common目录
如果你暂时无法升级Rust版本:
如果因为某些原因不能使用1.71+的版本,可以用以下替代方案(虽然不如pub(package)优雅,但符合规范):
- 在
src/lib.rs中创建一个仅对bin开放的内部模块,用#[cfg]标记仅在编译bin时生效:// src/lib.rs mod common; // 仅当编译指定的bin目标时才导出common的内容 #[cfg(any(target_bin = "my-bin-1", target_bin = "my-bin-2"))] pub use common::*; - 然后在bin中通过
use your_crate_name::cant_leak_this_function;引用 - 这个方案的原理是:当外部crate依赖你的库时,
target_bin条件不满足,所以这些导出的函数不会存在,自然无法被外部访问;只有编译对应的bin时,这些导出才会生效,让bin可以调用。
内容的提问来源于stack exchange,提问作者wickedlama
相关产品推荐
相关产品推荐

