Anchor中declare_id!宏使用环境变量的问题及技术咨询
Anchor框架中程序ID注入的问题
背景
在Anchor框架中,所有程序的顶部都必须包含declare_id!()语句,该语句的输入是一个Pubkey,通常以硬编码字符串形式存在。12Factor方法论通常要求避免这类硬编码配置值,但尝试实现无硬编码的过程却困难重重。
失败的尝试写法及原因
以下几种写法均无法正常运行:
- 写法一:
declare_id!(std::env::var("VARIABLE_NAME"));
失败原因:env::var在运行时执行,而宏在编译时执行,两者执行时机不匹配。
- 写法二:
declare_id!(env!("VARIABLE_NAME"));
失败原因:env!返回&str类型,不符合declare_id!对Pubkey类型参数的要求。
- 写法三:
declare_id!(Pubkey::from_str(env!("VARIABLE_NAME")));
失败原因:Pubkey::from_str可能执行失败,返回Result类型,无法被declare_id!接受。
- 写法四:
declare_id!(Pubkey::from_str(env!("VARIABLE_NAME")).unwrap());
失败原因:declare_id!要求传入常量,而unwrap无法生成编译期常量(?语法同理)。
技术疑问
- 如何在
declare_id!宏中使用环境变量? - 鉴于相关资料匮乏,推测在此场景下使用环境变量并非最佳实践,原因是什么?
- 若不使用环境变量,如何将程序ID注入Anchor应用?
附加问题
已知:
env::var()返回Result<&str>env::var_os()返回Result<&OsStr>env!()返回&strenv_os!()在core中不存在
问题:
- 如何在构建时处理
OsStr类型的环境变量? - 为何不需要这种能力?
内容的提问来源于stack exchange,提问作者dr-oofenshmirtz
相关产品推荐
相关产品推荐

