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

如何在Expo EAS构建中管理生产与开发环境密钥?

Expo EAS 多环境 Secrets 处理最佳实践

你现在用的「给变量加DEV_/PROD_前缀+代码内通过__DEV__判断取值」的方案能跑,但属于维护成本很高的笨办法,不是最优解。
这个方案的硬伤很明显:

  • 每加一个环境变量就要维护两份命名,变量多了之后冗余度极高
  • 环境判断逻辑散落在业务代码里,很容易写错漏写,甚至出现生产包读了开发配置的线上事故
  • 后续要加预发布、测试等新环境,得全量改代码里的判断分支,扩展性很差

官方推荐方案:用EAS原生能力做环境隔离,把判断逻辑从业务代码里剥离

核心思路是不同构建环境下的变量名完全保持一致,靠EAS的构建配置自动注入对应值,业务代码不需要感知当前运行环境,具体实现分三步:

  1. 先在项目根目录的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"
          }
        }
      }
    }
    
  2. 去expo.dev的项目Secrets配置页,不需要给变量加环境前缀,直接创建和代码里同名的变量(比如就叫STORAGE_BUCKET),给变量配置作用范围:开发环境的值绑定到development、preview构建profile,生产环境的值绑定到production构建profile。
    EAS触发对应profile的构建时,会自动把匹配作用域的变量值注入到构建环境,同名变量会根据当前构建类型自动替换成对应的值,不会混淆。
  3. 业务代码里直接读取变量即可,完全不需要写环境判断。如果用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:03:21