如何在Rust的mod.rs中单行引入指定文件夹下的全部模块
Rust 批量导入子模块解决方案
Rust 标准语法目前不支持类似pub mod **的通配符批量声明子模块的语法,官方设计上更倾向于显式声明模块来保证项目结构的可维护性,但针对你的场景可以通过以下两种成熟方案实现需求:
方案1:使用第三方 crate auto-mod 实现零配置自动导入
这是最轻量的使用方案,步骤如下:
- 在项目
Cargo.toml中添加依赖:
[dependencies] auto-mod = "0.1" # 可替换为crates.io上的最新版本
- 在
views/mod.rs中写入一行代码即可自动导入同目录下所有.rs文件作为子模块:
// 导入所有子模块,pub关键字可按需添加 auto_mod::auto_mod!(pub "src/views");
后续新增.rs文件到views目录下不需要修改任何代码,会自动被识别导入。
方案2:通过自定义构建脚本生成(无第三方依赖)
如果你不想引入额外依赖,可以自己写构建脚本自动生成mod.rs内容:
- 在项目根目录新建
build.rs文件,内容如下:
use std::{fs, path::Path}; fn main() { // 配置views目录路径 let views_path = Path::new("src/views"); let mut mod_content = String::new(); // 遍历目录下所有Rust文件 for entry in fs::read_dir(views_path).expect("无法读取views目录") { let entry = entry.expect("目录读取异常"); let file_path = entry.path(); // 仅处理.rs文件 if file_path.extension().and_then(|ext| ext.to_str()) == Some("rs") { let mod_name = file_path.file_stem().unwrap().to_str().unwrap(); // 跳过mod.rs本身 if mod_name != "mod" { mod_content.push_str(&format!("pub mod {};\n", mod_name)); } } } // 写入内容到mod.rs fs::write(views_path.join("mod.rs"), mod_content).expect("写入mod.rs失败"); }
- 每次新增
views目录下的文件后执行cargo build,脚本会自动更新mod.rs的模块声明。
注意:使用该方案不要手动修改
views/mod.rs的内容,否则会被构建脚本覆盖。
内容的提问来源于stack exchange,提问作者Randall Coding
相关产品推荐
相关产品推荐

