如何在Cargo包的客户端与服务端二进制文件间共享模块?
解决方法
你遇到的问题核心是:每个二进制目标的crate根是各自的入口文件,默认情况下相互独立,共享模块无法直接跨入口引用。以下两种方案可以解决:
方案一:将共享代码转为库模块(推荐)
这是Rust多二进制项目共享代码的标准做法,结构更清晰易维护:
- 修改
Cargo.toml,添加库目标配置:
[lib] name = "my_shared_lib" path = "src/shared/mod.rs"
(name可自定义,比如和项目同名)
- 在
server/mod.rs中同时引用共享库和本地模块:
// 引入共享库内容 use my_shared_lib::something2; // 引用server目录下的something.rs mod something; use crate::something;
client.rs中也能以同样方式引用共享库:
use my_shared_lib::something2;
方案二:调整二进制入口与模块声明
如果不想新增库目标,可通过调整文件结构和声明逻辑解决:
将
server/mod.rs重命名为src/server.rs,作为server二进制的入口文件。在
src/server.rs中声明shared和server子模块:
// 加载src/shared/mod.rs作为子模块 mod shared; // 加载src/server/mod.rs作为子模块(需在src/server目录下新建mod.rs) mod server; // 引用共享内容 use crate::shared::something2; // 引用server目录下的something.rs(需在src/server/mod.rs中声明mod something) use crate::server::something;
- 在
src/server/mod.rs中声明并引用本地模块:
mod something; use crate::something;
这样既可以在server入口中访问shared的内容,也能正常调用server目录下的模块。
内容的提问来源于stack exchange,提问作者Pinko
相关产品推荐
相关产品推荐

