You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何配置Rust Cargo为库的根 crate/模块设置自定义名称?

如何配置Rust Cargo为库的根 crate/模块设置自定义名称?

我太懂你从.NET转Rust时的这种适配纠结了——毕竟两者的模块/命名空间设计思路确实差得有点多。你想要的那种统一根模块下的结构完全能实现,不用被默认的crate命名绑定死,下面给你说两种最实用的方案:

方案一:用根crate重导出构建统一命名空间结构(最推荐,贴合.NET习惯)

这是最贴近你熟悉的.NET程序集+命名空间模式的做法:你可以在工作区里创建一个名为my_project的根库crate,然后把其他功能子crate(比如my_project_domainmy_project_web)的内容,统一重导出到my_project的对应子模块下。

具体步骤:

  1. 先在工作区里建好各个子crate,比如my_project_domain(处理领域逻辑)、my_project_web(处理Web层),再建一个my_project根crate。
  2. my_projectCargo.toml里添加对子crate的依赖:
[dependencies]
my_project_domain = { path = "../my_project_domain" }
my_project_web = { path = "../my_project_web" }
  1. my_projectlib.rs里,把子crate的内容重导出到对应模块:
// 把my_project_domain的所有公开项导出到my_project::domain下
pub mod domain {
    pub use my_project_domain::*;
}

// 把my_project_web的所有公开项导出到my_project::web下
pub mod web {
    pub use my_project_web::*;
}

这样一来,不管是在工作区的其他crate里,还是外部项目中,你都可以用my_project::domain::XXXmy_project::web::XXX这种完全贴合你习惯的方式引用代码,和.NET里的命名空间结构完美对齐。

方案二:单crate内调整模块结构(适合不需要跨crate统一的场景)

如果你只是想让单个crate对外暴露的根模块名和crate本身的名称不同,比如crate名叫my_project_domain,但想让它的内容出现在my_project::domain下,也可以直接在该crate的lib.rs里做嵌套导出:

// 在my_project_domain的lib.rs里
pub mod my_project {
    pub mod domain {
        // 把当前crate的所有公开项导进来
        pub use super::*;
    }
}

不过这种方式有个小缺点:外部引用时需要写my_project_domain::my_project::domain::XXX,不如方案一的结构干净,所以更适合小范围的模块调整。

额外小提示

  • 重导出时,你也可以针对性地导出特定项,而不是*,比如pub use my_project_domain::User;,这样能更精准地控制对外暴露的API。
  • 子crate之间互相引用时,直接用它们的原始crate名就行(比如my_project_domain里引用my_project_web),不用绕根crate,保持内部依赖的灵活性。

内容来源于stack exchange

火山引擎 最新活动