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

Rust模块循环导入问题求助:跨目录引用与测试代码调用

Rust模块导入与循环依赖问题解决

项目目录结构

├── Cargo.toml
├── program
│   ├── Cargo.lock
│   ├── Cargo.toml
│   └── src
│       ├── instruction.rs
│       ├── lib.rs
│       ├── mod.rs
│       └── state.rs
├── program.json
└── src
    └── lib.rs

一、修复program/src/lib.rs的模块导入错误

错误原因

  • 第一种写法用super报错:program/src/lib.rs是该crate的根模块,没有父模块,super指向父模块的用法在这里完全无效。
  • 第二种写法触发循环依赖:手动指定#[path = "./mod.rs"]给instruction模块,而mod.rs中又声明了pub mod lib,形成lib.rs→mod.rs→lib.rs的循环引用,属于多余的错误配置。

正确写法

删除program/src/lib.rs中的#[path = "./mod.rs"]行,直接在根模块中声明子模块并导入类型:

// program/src/lib.rs
// 声明子模块,Rust会自动关联同目录下的instruction.rs和state.rs文件
pub mod instruction;
pub mod state;

// 直接导入子模块中的类型(当前是crate根,可省略crate::前缀)
use instruction::LiquidityInstruction;
use state::LiquidityParams;

// 也可以用完整路径写法:
// use crate::instruction::LiquidityInstruction;
// use crate::state::LiquidityParams;

同时删除program/src/mod.rs中的pub mod lib;声明——如果该文件仅用于反向引用根模块,完全可以直接删除;如果需要聚合子模块,仅保留子模块声明即可,不要引用根模块。

二、实现测试目录src/lib.rs调用program模块

配置工作区与依赖

根目录的Cargo.toml需要配置为工作区,包含program和测试用crate:

# 根目录Cargo.toml
[workspace]
members = [
    "program",
    "."  # 当前目录的src/对应测试crate
]

在测试crate的Cargo.toml(根目录下的配置文件)中添加program依赖:

# 根目录Cargo.toml(测试crate配置)
[dependencies]
program = { path = "./program" }

在测试代码中导入program模块

现在可以直接在src/lib.rs中导入program的类型并编写测试:

// src/lib.rs(测试代码)
use program::instruction::LiquidityInstruction;
use program::state::LiquidityParams;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_liquidity_logic() {
        // 编写测试逻辑示例
        let params = LiquidityParams { /* 初始化字段 */ };
        assert!(true);
    }
}

内容的提问来源于stack exchange,提问作者zubayr khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:57:19