You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust标准库包结构中如何放置命令行工具公共模块?

Rust多命令行入口共享私有CLI逻辑的解决方案

下面是几种不用将共享代码移入核心库的可行方案:

方案一:显式指定编译的Bin目标,保留src/bin下的共享模块

  1. 在src/bin目录下创建cli_common.rs,写入所有需要共享的CLI工具代码,不需要包含main函数。
  2. 修改项目根目录的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;

方案二:用工作区私有子库隔离共享逻辑

如果共享代码体量较大,适合单独维护,可以用工作区拆分:

  1. 在项目根目录新建cli-common子目录,创建src/lib.rs并写入共享的CLI逻辑。
  2. 修改根目录Cargo.toml添加工作区配置:
[workspace]
members = ["cli-common", "."]
  1. 在根目录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" }
  1. 在两个入口文件中直接引用该子库:
use cli_common::your_shared_function;

这个子库属于工作区私有,不会被外部项目依赖,也完全不会污染核心库的逻辑。

方案三:用子目录组织共享模块

如果觉得同目录下文件太多,可以用子目录归类:

  1. 在src/bin下创建common目录,里面新建mod.rs写入共享代码。
  2. 在run_foo.rs和run_bar.rs中引入该模块:
mod common;
use common::your_shared_function;

Cargo只会把src/bin下直接的.rs文件当作二进制目标,子目录里的模块不会被单独编译,自然不需要main函数。

内容的提问来源于stack exchange,提问作者bluenote10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:00:56