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

