如何为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的测试框架可以省去手动构建的麻烦:
- 在项目A的Cargo.toml中添加匹配版本的
anchor-lang和anchor-client依赖 - 测试代码中使用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的版本控制:
- 拉取项目B的XYZ版本代码,执行构建命令:
cargo build --target bpfel-unknown-unknown --release
- 将生成的
program_b.so复制到项目A的fixtures目录 - 测试代码直接引用本地路径:
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
相关产品推荐
相关产品推荐

