Rust二进制Crate调用模块函数的正确方式?是否需用lib.rs?
原始项目信息
项目结构
src |-- abc |-- main.rs |-- logger |-- mod.rs Cargo.toml
Cargo.toml 配置
# Cargo.toml [[bin]] name = "abc" # This will be the name of the binary executable path = "src/abc/main.rs"
logger/mod.rs 内容
// logger/mod.rs pub fn call_logger() { println!("Got called!"); }
需求与当前实现
需求:从src/abc/main.rs中调用call_logger()函数。
当前实现:创建src/lib.rs并写入pub mod logger;,实现了函数调用,但担心lib.rs是库Crate专用,想知道更合适的实现方式。
解决方案
方案1:用#[path]属性直接导入模块(无需lib.rs)
由于main.rs在src/abc/,logger模块在同级的src/logger/,可以通过#[path]指定模块文件的相对路径,直接在main.rs中导入:
修改src/abc/main.rs:
#[path = "../logger/mod.rs"] mod logger; fn main() { logger::call_logger(); }
这种方式适合小型项目,无需额外创建lib.rs,直接在二进制目标中引用其他目录的模块。
方案2:保留lib.rs(推荐的标准做法)
你最初用src/lib.rs的做法完全合规且符合Rust项目规范。一个Crate可以同时包含库(lib.rs)和多个二进制目标(通过[[bin]]配置),这是业界常用的结构:把公共逻辑放在库中,二进制目标仅负责调用库代码。
保持现有src/lib.rs不变,修改src/abc/main.rs:
use crate::logger; fn main() { logger::call_logger(); }
这种方式的优势是扩展性强——后续如果新增其他二进制工具,能直接复用logger模块的代码,结构更清晰。
方案3:调整目录结构,将logger作为main.rs的子模块
如果不想用lib.rs,可把logger目录移到src/abc/下:
src |-- abc |-- main.rs |-- logger |-- mod.rs Cargo.toml
然后修改src/abc/main.rs:
mod logger; fn main() { logger::call_logger(); }
这种方式适合logger仅服务于当前二进制目标的场景,但不利于跨二进制目标复用代码。
内容的提问来源于stack exchange,提问作者napri
相关产品推荐
相关产品推荐

