我有一个铁 rust 项目(这是一个扫雷游戏的实现).

游戏本身的所有功能都是以库的形式编写的,因此它可以1)在crates.io上以 crate 的形式共享,2)与不同的前端一起使用.

目前我有两个前端:第一个是debug_main,这只是游戏最基本的文本输入/输出;另一个是main,它是用ratatui编写的TUI.

enter image description here

目前的问题是我不喜欢这种文件 struct .最大的问题是,现在bin文件夹中的所有内容都被视为单独的可执行文件.因此,我可以运行cargo run --bin main--bin debug_main以及--bin app--bin game_ui,这不是我想要的,因为只有两个可执行文件:maindebug_main,而所有其他文件(appeventgame_uimenu_uituiupdate)都是main的依赖项.

这个文件 struct comes from ratatui:因为它是一个框架,而不仅仅是一个库,它规定了要坚持的文件/项目 struct (显然,我知道我可以偏离它,但不是一个足够专业的人来认为"我知道得更好").

因此,他们所规定的,实际上是将你的应用程序分割成一个可执行文件(main)和库(所有其他文件).但对我(as i understand it岁)来说,有一个问题是我已经有了自由.据我所知,每个 crate 不可能有超过一个lib.

在我的情况下我该怎么做?我如何至少提取bin文件夹中的所有文件(除了maindebug_main这两个可执行文件),使它们不会也成为可执行文件?当我的项目被分成1个库和许多二进制文件,但同时二进制文件本身可能需要底层库时,我应该如何组织它?In general,我如何将项目中的事情安排得井然有序?最好的推荐是什么?

作为参考,下面是Cargo.toml个文件的内容(没有什么特别之处):

[package]
name = "miners"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
clap = { version = "4.4.18", features = ["derive"] }
color-eyre = "0.6.2"
crossterm = "0.27.0"
rand = "0.8.5"
ratatui = "0.25.0"

以下是main.rs年度的mod项声明:

mod app;
mod event;
mod game_ui;
mod menu_ui;
mod tui;
mod update;

debug_main年内

use miners::{field::Field, Minesweeper, MinesweeperAction, MinesweeperStatus};

推荐答案

您可以 Select

  1. 创建一个Cargo 工作区,将不同的应用程序彼此分开,并拥有多个要单独共享的库;这允许您对每个库(https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html)具有单独的依赖关系
  2. 使用多文件可执行文件(https://doc.rust-lang.org/cargo/guide/project-layout.html)
    ├── src/
    │   ├── lib.rs
    │   ├── some_module.rs
    │   └── bin/
    │       ├── debug/
    │       │   ├── main.rs
    │       │   └── some_module.rs
    │       └── tui/
    │           ├── main.rs
    │           └── some_module.rs

bin目录下的每个文件夹或module将是一个正在构建的单独的可执行文件.可执行文件的名称将是目录名.

Rust相关问答推荐

访问Rust中的隐藏变量

Rust:跨多个线程使用hashmap Arc和rwlock

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

如何用Axum/Tower压缩Html内容?

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

当发送方分配给静态时,Tokio MPSC关闭通道

如何修复&q;无法返回引用函数参数的值在异步规则中返回引用当前函数&q;拥有的数据的值?

为什么Option类型try块需要类型注释?

Rust将String上的迭代器转换为&;[&;str]

如何实现Deref;多次;?

获取已知数量的输入

详尽的匹配模式绑定

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

有没有办法隐式绑定 let/match 操作的成员?

从 Cranelift 发出 ASM

如何将 u8 切片复制到 u32 切片中?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?