如何在Expo EAS构建中管理生产与开发环境密钥?
Expo EAS 多环境 Secrets 处理最佳实践
你现在用的「给变量加DEV_/PROD_前缀+代码内通过__DEV__判断取值」的方案能跑,但属于维护成本很高的笨办法,不是最优解。
这个方案的硬伤很明显:
- 每加一个环境变量就要维护两份命名,变量多了之后冗余度极高
- 环境判断逻辑散落在业务代码里,很容易写错漏写,甚至出现生产包读了开发配置的线上事故
- 后续要加预发布、测试等新环境,得全量改代码里的判断分支,扩展性很差
官方推荐方案:用EAS原生能力做环境隔离,把判断逻辑从业务代码里剥离
核心思路是不同构建环境下的变量名完全保持一致,靠EAS的构建配置自动注入对应值,业务代码不需要感知当前运行环境,具体实现分三步:
- 先在项目根目录的
eas.json里给不同构建场景定义profile,明确每个构建场景的环境属性:{ "build": { "development": { "developmentClient": true, "distribution": "internal", "env": { "APP_ENV": "development" } }, "preview": { "distribution": "internal", "env": { "APP_ENV": "staging" } }, "production": { "autoIncrement": true, "env": { "APP_ENV": "production" } } } } - 去expo.dev的项目Secrets配置页,不需要给变量加环境前缀,直接创建和代码里同名的变量(比如就叫
STORAGE_BUCKET),给变量配置作用范围:开发环境的值绑定到development、preview构建profile,生产环境的值绑定到production构建profile。
EAS触发对应profile的构建时,会自动把匹配作用域的变量值注入到构建环境,同名变量会根据当前构建类型自动替换成对应的值,不会混淆。 - 业务代码里直接读取变量即可,完全不需要写环境判断。如果用
expo-constants读取配置:
如果是配合import Constants from 'expo-constants'; // 不管是开发还是生产包,直接拿值就行,不需要判断 const storageBucket = Constants.expoConfig.extra.STORAGE_BUCKET;babel-plugin-inline-dotenv或者Expo Router自带的环境变量能力,直接读process.env.STORAGE_BUCKET就可以。
如果要对齐本地开发的体验,只需要在项目根目录放和profile对应的.env.development、.env.production文件,文件里的变量名和EAS Secrets里的保持一致,本地启动项目时Metro会自动根据运行模式加载对应env文件,和线上构建的读取逻辑完全统一,不需要额外写适配代码。
注意:所有敏感密钥不要硬编码在
eas.json或者本地.env文件里提交到代码仓库,存在expo.dev上的Secrets是加密存储的,只会在对应权限的构建任务中临时注入,不会泄露到公开日志或者代码包的明文位置。
只有一种场景适合你最初提到的前缀+代码判断方案:就是你需要在同一个开发安装包里,手动切换生产/开发环境做调试,这种场景才需要保留多套变量加手动切换逻辑。常规分环境构建、分发、上线的流程,完全不需要在代码里写环境判断。
内容的提问来源于stack exchange,提问作者GollyJer
相关产品推荐
相关产品推荐

