## `src/rucmd` 模块讲解
`rucmd` 是 **ruwebframe** 框架的 **命令行工具层**,提供统一的 CLI 入口,支持加密解密、配置查看、DI 代码生成、依赖安装、实体代码生成等功能。下面逐一解析每个文件。
---
### 📁 文件结构
```
rucmd/
├── mod.rs # 模块声明与导出
├── ru_cmd.rs # 核心命令执行器(RuCmd)
├── ru_cmd_init.rs # RuCmd 的 DI 自动注册
├── ru_cmd_test.rs # 命令测试用例
└── readme.MD # 已有文档
```
---
### 1️⃣ `mod.rs` — 模块入口
```rust
pub mod ru_cmd;
pub use ru_cmd::*;
pub mod ru_cmd_init;
#[cfg(test)]
mod ru_cmd_test;
```
- 声明 `ru_cmd` 和 `ru_cmd_init` 子模块
- 通过 `pub use ru_cmd::*` 重新导出所有公共项,外部可直接 `use rucmd::...`
- 测试模块仅在 `cfg(test)` 时编译
---
### 2️⃣ `ru_cmd.rs` — 核心命令执行器
#### 结构体与单例设计
```rust
#[derive(Debug, Default, Serialize, Clone, Deserialize)]
pub struct RuCmd {}
impl BaseEntitySingle for RuCmd {}
```
`RuCmd` 是一个**无字段的空结构体**,纯方法驱动。通过实现 `BaseEntitySingle` trait,它被注册为 **全局单例 Bean**。
#### 命令路由:`execute()` 方法(第262行)
这是整个 CLI 的核心入口,根据 `args[1]` 分发命令:
| `enc` | `<text>` | 加密文本 | `enc()` → `ruenc` |
| `dec` | `<text>` | 解密文本 | `dec()` → `ruenc` |
| `conf` | `env/db/redis/web` | 查看配置 | `list_conf()` |
| `rudi` | `list/all/<name>/force/suite/suites` | DI 代码生成 | `rudi()` → `difactroy` |
| `version`/`v` | — | 显示版本 | `version()` |
| `help`/`h` | — | 显示帮助 | `help()` |
| `i`/`inst` | `cmd/data/conf/web/all/...` | 安装依赖模板 | `inst()` |
| `list` | `<dir>` | 列出日志文件 | `list_log()` |
| `table` | `<name>/all` | 生成数据库实体 | `make_table_entity()` |
| `dbcode` | `<table>/all` | 生成 DB 实体代码 | `find_bean_db_code()` |
#### 功能详解
**🔐 加密解密(第75-83行)**
```rust
pub fn enc(&self, args: &Vec<String>) {
let result = ruenc::find_bean_ru_enc().unwrap().enc(&args[2]);
println!("{}", result);
}
```
直接委托给 `ruenc` 模块的 AES-256-GCM 加解密,用于敏感配置字段。
**⚙️ 配置查看(第206-258行)**
支持按模块过滤:`conf env` → software 配置,`conf db` → 数据源配置,`conf redis` → Redis 配置,`conf web` → Web 配置。
**🏭 DI 代码生成(第84-112行)**
这是最强大的自动化能力:
- `rudi list` — 列出所有可自动注入的结构体
- `rudi all` — 批量生成所有结构体的 DI 注册代码
- `rudi Person` — 为指定结构体生成
- `rudi force Person` — 强制重新生成
- `rudi suite Person` — 生成测试套件
- `rudi suites` — 批量生成所有测试套件
**📦 依赖模板安装(第113-204行)**
`inst` 命令会将框架内置的模板目录拷贝到当前项目,例如:
```rust
pub fn copy_pkg_web() {
copy_pkg_dir("src/ructl"); // 拷贝 web 控制器模板
find_bean_code_inst().unwrap().edit_module_rs_all("ructl"); // 修改 mod.rs
}
```
支持的模板:`all`, `mini`, `web`, `data`, `domain`, `task`, `cmd`, `conf`, `docker`, `test`, `docx`, `lib` 等。
**🗄️ 数据库实体生成(第413-438行)**
```rust
pub fn make_table_entity(table_name: &str) -> String {
let cmd = format!(
"sea-orm-cli generate entity -u {} -o {}/src/data/{}/dbentity --with-serde both",
datasource.build_url_orm_datasource(),
base_dir, dbtype
);
// 调用 sea-orm-cli 生成 SeaORM 实体代码
}
```
底层调用 `sea-orm-cli`,自动为数据库表生成 Rust 结构体。
---
### 3️⃣ `ru_cmd_init.rs` — DI 自动注册
```rust
#[ctor(unsafe)]
pub fn init() {
RuCmd::register_bean();
}
pub fn find_bean_ru_cmd() -> Option<Arc<RuCmd>> {
RuCmd::find_bean()
}
impl BeanSingle for RuCmd {
fn new_bean() -> Self {
let mut bean = RuCmd::default();
bean.init();
bean
}
}
```
- 使用 `ctor::ctor` 在程序启动时自动执行 `init()`,将 `RuCmd` 注册到 DI 容器
- `find_bean_ru_cmd()` 是全局获取入口,返回 `Arc<RuCmd>`
- 文件头部注释说明 "StructInit自动生成,一般不要手动修改" — 由 `rudi` 命令自动生成
---
### 4️⃣ `ru_cmd_test.rs` — 测试用例
测试覆盖了:
- `help()` 命令输出
- DI 工厂的 `make_di()` / `list_di()`
- 文件工具:`list_files`, `list_all_files_suffix`, `list_rs_files`, `find_dir`, `check_file_exists`
- `WinCmd` 命令执行
---
### 🏗️ 架构定位图
```
┌─────────────────────────────────────────────────────┐
│ rucmd (CLI 层) │
│ │
│ RuCmd.execute(args) ── 命令路由 ──┐ │
│ │ │
│ enc/dec ──── ruenc (加密) │ │
│ conf ──── ruconf (配置) │ │
│ rudi ──── difactroy (DI工厂) │ │
│ inst ──── copy_pkg_dir (模板拷贝) │ │
│ table ──── sea-orm-cli (实体生成) │ │
│ list ──── fileutils (文件) │ │
└─────────────────────────────────────┼─────────────────┘
│
DI 容器全局注册
│
▼
find_bean_ru_cmd() → Arc<RuCmd>
```
### 💡 设计亮点
1. **单例 Bean 模式** — 通过 `BaseEntitySingle` + `ctor` 自动注册,全局唯一实例
2. **委托式架构** — RuCmd 本身不做具体业务,全部委托给底层模块(ruenc、ruconf、difactroy 等),职责清晰
3. **代码生成自动化** — `rudi` 命令能自动生成 DI 注册代码,`table` / `dbcode` 能自动生成数据库实体,大幅减少样板代码
4. **模板化项目结构** — `inst` 命令可以一键把框架的各种模块模板拷贝到新项目中,实现快速 scaffolding