rust的main.rs和lib.rs该怎么写

🧠 一句话理解:

  • main.rs 是程序的“入口” —— 负责“接线”,不写业务逻辑;
  • lib.rs 是程序的“内核” —— 组织你的领域层、应用层等逻辑模块,供 main.rs(或测试)调用。

🗂️ 文件职责对比表

文件作用内容建议是否包含逻辑
main.rs应用程序入口(Presentation)解析命令行、调用 lib 中逻辑❌不包含业务逻辑
lib.rs统一导出模块,组织架构pub mod xxx;,DDD层统一暴露接口✅组织逻辑模块

main.rs 应该写什么?

src/main.rs 中,建议这样写(适合 CLI 工具):

fn main() {
    // 初始化日志、解析 CLI 参数
    let args = xshell::presentation::cli::parse_args();

    // 加载配置(来自配置文件、env)
    let config = xshell::infrastructure::config::load_config();

    // 执行业务逻辑(调用 orchestrator)
    if let Err(e) = xshell::application::orchestrator::run(args, config) {
        eprintln!("Error: {:?}", e);
        std::process::exit(1);
    }
}

👆 main.rs 的职责是组织调度调用 lib.rs 中暴露的能力,不要包含任何业务逻辑。


lib.rs 应该写什么?

src/lib.rs 中:

pub mod presentation;
pub mod application;
pub mod domain;
pub mod infrastructure;

如果你想为测试暴露一套 API,可以这样写:

pub use application::orchestrator::run;

甚至可以在这里做一层封装暴露简化 API:

pub fn execute(args: Args) -> Result<()> {
    let config = infrastructure::config::load_config();
    application::orchestrator::run(args, config)
}

📦 如果是用于测试的结构(TDD驱动)

你可以直接在 lib.rs 中写:

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_runs_successfully() {
        let args = /* mock args */;
        let config = /* mock config */;
        assert!(application::orchestrator::run(args, config).is_ok());
    }
}

这样你的业务核心逻辑就完全与 CLI、主函数解耦了。


🧱 推荐的执行流结构(DDD+CLI)

main.rs ─→ cli.rs
           │
           ↓
      orchestrator.rs
           │
           ↓
      domain/* + infrastructure/*

✅ 总结一句话:

  • main.rs:只管组织程序流程、入口、参数解析,不做“事”。
  • lib.rs:暴露架构核心模块,便于测试和复用,是你“可被调用”的 DDD 内核。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pumpkin84514

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值