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

Rust Cargo工作区如何通过父包方法获取子成员包的版本号

解决方案

你需要把foo包中定义的普通函数替换为声明式宏,利用宏在调用方编译上下文展开的特性拿到对应包的版本号。

步骤1 修改foo包的实现

将foo/src/lib.rs中原有的函数替换为如下宏定义:

#[macro_export]
macro_rules! get_version {
    () => {
        env!("CARGO_PKG_VERSION")
    };
}

步骤2 调整调用方代码

修改bar/src/main.rs的调用逻辑:

fn main() {
    println!("{}", get_version!());
}

修改后重新执行cargo run -p bar即可输出预期的0.2.0,其他工作区成员调用该宏也会返回自身的版本号。


实现原理

原方案的普通函数是在foo包编译阶段完成构建的,env!宏读取的是foo包编译时的环境变量,所以所有调用方拿到的都是foo的版本号。而声明式宏会在调用方的编译阶段展开到对应位置,此时读取的CARGO_PKG_VERSION就是当前编译的调用方包的版本,不需要重复编写逻辑即可实现多包复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:03