rucmd 0.1.3

a simple ttool rucmd.
rucmd-0.1.3 is not a library.

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 — 模块入口

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 — 核心命令执行器

结构体与单例设计

#[derive(Debug, Default, Serialize, Clone, Deserialize)]
pub struct RuCmd {}

impl BaseEntitySingle for RuCmd {}

RuCmd 是一个无字段的空结构体,纯方法驱动。通过实现 BaseEntitySingle trait,它被注册为 全局单例 Bean。

命令路由:execute() 方法(第262行)

这是整个 CLI 的核心入口,根据 args[1] 分发命令:

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行)

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 命令会将框架内置的模板目录拷贝到当前项目,例如:

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行)

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 自动注册

#[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