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

EAS构建动态配置执行三次且最后丢失环境变量问题

EAS构建中app.config.js函数三次执行及环境变量丢失问题排查

函数执行三次的原因

  • EAS构建iOS项目存在多阶段配置读取流程:本地CLI预校验、云端构建初始化、Xcode项目生成,这三个阶段都会触发app.config.js默认函数的调用,属于正常构建流程行为。
  • Expo CLI与云端构建服务的双重读取:本地执行命令时CLI会先读取配置做参数校验,云端构建服务在准备环境和注入原生项目时又各读取一次,合计三次调用。

最后一次环境变量丢失的原因

  • 进程上下文差异:云端构建的最后阶段(如生成Xcode项目)处于独立进程,EAS默认只在构建脚本执行阶段注入环境变量,此阶段process.env未被正确初始化。
  • 变量命名或读取方式错误:未使用EXPO_PUBLIC_前缀命名环境变量,Expo不会自动将非前缀变量注入到app.config.js的所有读取阶段;直接同步读取process.env未利用Expo的配置上下文,导致部分阶段无法获取变量。

解决方案

  • 统一使用EXPO_PUBLIC_前缀命名变量:在eas.json的各profile的env字段中,将变量改为EXPO_PUBLIC_API_URL这类格式,Expo会确保其在所有构建阶段的process.env中可用。
    // eas.json示例
    {
      "build": {
        "staging": {
          "env": {
            "EXPO_PUBLIC_API_URL": "https://my-url.com/"
          }
        }
      }
    }
    
  • 优化app.config.js的变量读取逻辑:结合Expo配置上下文做降级处理,避免依赖单一读取方式:
    // app.config.js示例
    export default ({ config }) => {
      const apiUrl = process.env.EXPO_PUBLIC_API_URL || config.extra?.apiUrl;
      console.log('ENV', apiUrl);
      return {
        ...config,
        extra: {
          apiUrl,
        },
      };
    };
    
  • 验证构建阶段的变量注入:在eas.json的profile中添加buildCommand,提前打印变量确认注入情况:
    {
      "build": {
        "staging": {
          "env": {
            "EXPO_PUBLIC_API_URL": "https://my-url.com/"
          },
          "buildCommand": "echo $EXPO_PUBLIC_API_URL && expo build:ios"
        }
      }
    }
    
  • 忽略多次调用的控制台输出:三次调用是正常流程,无需针对调用次数做逻辑调整,只需确保最终构建产物中变量正确即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:10:40