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
相关产品推荐
相关产品推荐

