EAS未为app.config正确应用环境变量问题求助
问题分析与解决方案
核心问题原因
你遇到的问题根源在于:Expo构建流程中,package(Android应用包名)、应用名称、图标/启动页这类顶层配置字段的解析时机,早于你通过dotenv加载环境变量的时机;或者你的app.config.ts未以动态函数形式导出配置,导致环境变量还未加载就已经解析了这些字段,最终始终使用开发环境的默认值。
另外需要确认:你的.env.development和.env.production文件没有被.easignore或.gitignore排除,否则EAS构建容器中无法读取到正确的环境文件,会 fallback 到本地缓存或默认值。
分步解决方案
1. 改为动态函数式导出app.config.ts
将app.config.ts改为函数式导出,确保dotenv加载完成后再生成配置对象,这样所有顶层字段都能正确读取环境变量:
import { config } from "dotenv"; import { ExpoConfig } from "@expo/config"; // 优先加载EAS传递的ENVFILE指定的环境文件 config({ path: process.env.ENVFILE }); // 动态导出配置,确保环境变量加载完成后再解析字段 export default (): ExpoConfig => ({ name: process.env.APP_NAME || "MyApp", slug: "myapp", // 保持不变,绑定单个Expo项目 // Android包名,对应你.env里的BUNDLE_ID package: process.env.BUNDLE_ID || "com.myapp", // 根据环境切换图标 icon: process.env.ENV_NAME === "development" ? "./assets/icon-dev.png" : "./assets/icon.png", // 根据环境切换启动页 splash: { image: process.env.ENV_NAME === "development" ? "./assets/splash-dev.png" : "./assets/splash.png", resizeMode: "contain", backgroundColor: "#ffffff" }, extra: { apiUrl: process.env.API_URL, environment: process.env.ENV_NAME, }, // 其他原有配置(如android、ios、plugins等) android: { adaptiveIcon: { foregroundImage: process.env.ENV_NAME === "development" ? "./assets/adaptive-icon-dev.png" : "./assets/adaptive-icon.png", backgroundColor: "#FFFFFF" } } });
2. 确认环境文件被包含在构建上下文
检查你的.easignore和.gitignore文件,确保没有添加.env.development和.env.production的忽略规则。如果这些文件被忽略,EAS构建容器无法读取到正确的环境变量,会使用本地缓存的开发环境值。
3. 验证构建时的环境变量加载
在app.config.ts中添加日志输出,用于确认构建时环境变量是否正确加载:
// 在dotenv加载后添加日志 console.log("=== ENVIRONMENT LOADED ==="); console.log("ENVFILE:", process.env.ENVFILE); console.log("BUNDLE_ID:", process.env.BUNDLE_ID); console.log("APP_NAME:", process.env.APP_NAME);
运行构建命令时,查看构建日志中的这些输出,确认环境变量是否对应你指定的构建profile。
4. 强制清理构建缓存并重新构建
使用以下命令彻底清理缓存并构建生产环境(示例):
eas build --clear-cache --platform android --profile production
关键说明
- 只要
package字段(Android应用包名)正确解析为不同的值(com.myapp.dev和com.myapp),两个版本的APK就能同时安装在手机上,不需要修改slug字段——slug只是Expo项目的标识,和本地应用的包名无关。 - 所有依赖环境变量的顶层配置字段(如
name、icon、splash)都必须在动态函数中读取,确保环境变量加载完成后再解析。
内容的提问来源于stack exchange,提问作者Ognjen Mišić
相关产品推荐
相关产品推荐

