Rust Crate正确组织结构 两种目录方案差异与惯用选型
两种结构的等价性判断
首先你列出的第一种文件结构是无效的:foo/、bar/目录放在crate根目录与src/平级时,Cargo默认不会将这两个目录下的代码纳入编译范围,完全无法实现预期的模块调用。
如果是笔误将foo/、bar/放在src/目录下,修正后的结构为:
some-crate/ |- src/ | |- bits.rs | |- bobs.rs | |- lib.rs | |- foo/ | | |- mod.rs | |- bar/ | | |- mod.rs
此时当foo、bar模块本身没有嵌套子模块时,它和你列出的第二种结构在模块访问逻辑上完全等价:
- 只要在
lib.rs中声明mod foo; mod bar; mod bits; mod bobs;,两种结构都支持some-crate::foo::do_this()形式的调用 - 只要
bits.rs、bobs.rs中需要对外暴露的项标记为pub,foo、bar模块都可以通过crate::bits::xxx、crate::bobs::xxx路径访问公共项,满足跨模块调用需求。
符合Rust惯用写法的推荐方案
结合你提到的「总共仅4个子模块、规模小无过重管理负担」的需求,优先选择第二种单文件结构:
- 这种扁平结构是当前Rust社区更推荐的小项目模块写法,不需要额外创建目录、维护多余的
mod.rs文件,浏览代码时不需要在多个同名mod.rs之间切换,定位文件效率更高 - 后续如果某个模块需要扩展子模块、拆分多文件,随时可以把对应单文件(比如
src/foo.rs)替换为src/foo/mod.rs目录结构,上层的模块声明、外部调用路径完全不需要改动,迁移零成本。
补充:
目录名/mod.rs的写法更适合模块本身存在多个子模块、或者单模块代码量过大需要拆分为多个同层级文件的场景,小体量模块提前用这种结构属于不必要的冗余。
内容的提问来源于stack exchange,提问作者MattP
相关产品推荐
相关产品推荐

