You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:08:42