解决Rust crate单库多二进制限制:扫雷项目结构优化
优化Rust扫雷项目结构的两种方案
你的核心诉求是让Cargo仅将main.rs和debug_main.rs视为可执行文件,同时妥善存放TUI前端的依赖代码(app、event等),以下是两种可行方案:
方案一:将TUI依赖代码整合到核心库中
适合希望TUI相关逻辑也能被其他潜在前端复用的场景:
- 调整目录结构:在
src目录下新建tui子目录,将原bin目录下的app.rs、event.rs、game_ui.rs、menu_ui.rs、tui.rs、update.rs全部移动到src/tui下。 - 声明库模块:在
src/lib.rs中添加:
同时新建pub mod tui;src/tui/mod.rs文件,导出子模块:pub mod app; pub mod event; pub mod game_ui; pub mod menu_ui; pub mod tui; pub mod update; - 修改main.rs的引用:将原
mod声明替换为库模块引用:use miners::tui::{app, event, game_ui, menu_ui, tui, update}; - 清理bin目录:此时
bin目录仅保留main.rs和debug_main.rs,Cargo会自动将这两个文件作为独立可执行目标编译。
方案二:为TUI前端创建独立的子目录入口
适合希望TUI逻辑与核心库完全隔离的场景:
- 调整bin目录结构:在
bin目录下新建miners_tui子目录,将原bin目录下的main.rs、app.rs、event.rs等TUI相关文件全部移动到该子目录中,仅保留debug_main.rs在bin根目录。 - 配置Cargo.toml:添加二进制目标的路径声明,明确指定需要编译的可执行文件:
[[bin]] name = "miners" path = "bin/miners_tui/main.rs" [[bin]] name = "debug_miners" path = "bin/debug_main.rs" - 保留原有引用逻辑:因为所有依赖文件和
main.rs同属一个子目录,原有的mod声明无需修改,Cargo会正确识别它们是miners可执行文件的内部模块,不会单独编译。
额外说明
- 两种方案都不会影响核心库的发布(
crates.io只会发布src目录下的库代码)。 - 方案一中如果不希望TUI模块被外部用户访问,可以将
pub mod tui改为mod tui,仅让内部二进制目标通过use crate::tui::...引用。
内容的提问来源于stack exchange,提问作者smellyshovel
相关产品推荐
相关产品推荐

