Rust标准库包结构中如何放置命令行工具公共模块?
Rust多命令行入口共享私有CLI逻辑的解决方案
下面是几种不用将共享代码移入核心库的可行方案:
方案一:显式指定编译的Bin目标,保留src/bin下的共享模块
- 在
src/bin目录下创建cli_common.rs,写入所有需要共享的CLI工具代码,不需要包含main函数。 - 修改项目根目录的
Cargo.toml,显式列出要编译的二进制入口,排除cli_common.rs:
[[bin]] name = "run_foo" path = "src/bin/run_foo.rs" [[bin]] name = "run_bar" path = "src/bin/run_bar.rs"
Cargo默认会把src/bin下所有.rs文件当作独立二进制目标,显式指定后就只会编译你列出的两个入口,不会处理cli_common.rs。
3. 在run_foo.rs和run_bar.rs中引入共享模块:
// 引入同目录下的cli_common模块 mod cli_common; use cli_common::your_shared_function;
方案二:用工作区私有子库隔离共享逻辑
如果共享代码体量较大,适合单独维护,可以用工作区拆分:
- 在项目根目录新建
cli-common子目录,创建src/lib.rs并写入共享的CLI逻辑。 - 修改根目录
Cargo.toml添加工作区配置:
[workspace] members = ["cli-common", "."]
- 在根目录
Cargo.toml的二进制入口配置中添加私有依赖:
[[bin]] name = "run_foo" path = "src/bin/run_foo.rs" dependencies = { path = "../cli-common", version = "0.1.0" } [[bin]] name = "run_bar" path = "src/bin/run_bar.rs" dependencies = { path = "../cli-common", version = "0.1.0" }
- 在两个入口文件中直接引用该子库:
use cli_common::your_shared_function;
这个子库属于工作区私有,不会被外部项目依赖,也完全不会污染核心库的逻辑。
方案三:用子目录组织共享模块
如果觉得同目录下文件太多,可以用子目录归类:
- 在
src/bin下创建common目录,里面新建mod.rs写入共享代码。 - 在
run_foo.rs和run_bar.rs中引入该模块:
mod common; use common::your_shared_function;
Cargo只会把src/bin下直接的.rs文件当作二进制目标,子目录里的模块不会被单独编译,自然不需要main函数。
内容的提问来源于stack exchange,提问作者bluenote10
相关产品推荐
相关产品推荐

