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

如何为Solana集成测试构建项目依赖构件program_b.so?

解决依赖Solana程序构件的测试部署问题

方案1:简化版Build.rs构建(无需手动下载依赖)

你想到的build.rs思路完全可行,而且可以利用Cargo已有的依赖管理简化流程,不用手动下载项目B代码:

  • 在项目A的build.rs中直接调用Cargo构建项目B的BPF目标,再将产物复制到fixtures目录
  • 示例代码:
use std::process::Command;
use std::fs;
use std::path::Path;

fn main() {
    // 构建项目B的BPF release构件
    let build_status = Command::new("cargo")
        .args([
            "build",
            "--target", "bpfel-unknown-unknown",
            "--release",
            "--package", "project_b",
        ])
        .status()
        .expect("构建project_b失败");
    
    assert!(build_status.success(), "project_b构建未通过");

    // 创建fixtures目录并复制构件
    let dest_dir = "./fixtures";
    fs::create_dir_all(dest_dir).expect("创建fixtures目录失败");
    fs::copy(
        "./target/bpfel-unknown-unknown/release/program_b.so",
        Path::new(dest_dir).join("program_b.so")
    ).expect("复制program_b.so失败");
}
  • 前提:项目A的Cargo.toml已正确引入项目B的Git依赖(指定rev为XYZ),确保Cargo能识别到该包。

方案2:用Anchor工具链自动处理(若项目B基于Anchor)

如果项目B是Anchor开发的,直接用Anchor的测试框架可以省去手动构建的麻烦:

  1. 在项目A的Cargo.toml中添加匹配版本的anchor-lang和anchor-client依赖
  2. 测试代码中使用Anchor的ProgramTest加载项目B,它会自动处理构件构建与部署:
use anchor_client::ProgramTest;

#[tokio::test]
async fn test_integration() {
    let mut program_test = ProgramTest::new(
        "project_a",
        env!("CARGO_PKG_IDENT"),
        None,
    );

    // 添加项目B程序,Anchor会自动从Cargo依赖中找到并构建
    program_test.add_program(
        "project_b",
        "./target/bpfel-unknown-unknown/release/program_b.so"
    );

    let ctx = program_test.start_with_context().await;
    // 后续测试逻辑
}
  • 更省心的方式:直接在项目A根目录运行anchor test,它会自动构建所有依赖的Anchor程序并部署到测试环境。

方案3:预构建构件纳入版本控制(适合稳定依赖)

如果项目B的XYZ版本是固定稳定的,可提前构建好构件并加入项目A的版本控制:

  1. 拉取项目B的XYZ版本代码,执行构建命令:
cargo build --target bpfel-unknown-unknown --release
  1. 将生成的program_b.so复制到项目A的fixtures目录
  2. 测试代码直接引用本地路径:
use solana_program_test::ProgramTest;

#[tokio::test]
async fn test_integration() {
    let mut program_test = ProgramTest::default();
    program_test.add_program(
        "project_b",
        "./fixtures/program_b.so",
        None,
    );
    // 后续测试逻辑
}

这种方式适合依赖版本长期不变的场景,避免每次测试重复构建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:53:09