Expo EAS构建时环境变量与密钥未被完全识别的问题
解决方案
1. 替换dotenv为Expo内置环境变量读取方式
移除app.config.ts中的dotenv依赖,改用Expo ConfigContext提供的env对象获取环境变量。EAS构建时会自动注入Secrets到env中,本地开发也会自动加载.env/.env.local文件的变量,无需手动调用dotenv.config()。
修改后的app.config.ts:
import { ExpoConfig, ConfigContext } from "expo/config"; export default ({ config, env }: ConfigContext): ExpoConfig => ({ ...config, ios: { ...config.ios, googleServicesFile: env.GOOGLE_SERVICES_PLIST!, }, android: { ...config.android, googleServicesFile: env.GOOGLE_SERVICES_JSON!, }, plugins: [ ...config.plugins || [], [ "react-native-fbsdk-next", { appID: env.SSO_FB_APPID!, clientToken: env.SSO_FB_CLIENT_TOKEN!, displayName: "my-app", scheme: `fb${env.SSO_FB_APPID!}`, }, ], ], });
注:
!是非空断言,确保变量不为undefined,避免插件因值缺失报错。
2. 验证EAS Secrets的关联配置
确保Secrets已正确绑定到目标构建环境(如production/development):
- 运行
eas secret:list查看所有Secrets,确认SSO_FB_APPID、SSO_FB_CLIENT_TOKEN、GOOGLE_SERVICES_JSON、GOOGLE_SERVICES_PLIST已存在且关联到对应profile。 - 若缺失,用
eas secret:push --scope project --name <SECRET_NAME> --value <SECRET_VALUE> --profile <TARGET_PROFILE>添加。
3. 处理本地构建的Google服务文件路径
本地prebuild时,需在.env.local中配置本地文件的相对路径:
GOOGLE_SERVICES_JSON=./google-services.json GOOGLE_SERVICES_PLIST=./GoogleService-Info.plist
确保这些文件存在于项目根目录,且已添加到.gitignore避免提交到仓库。
4. 升级react-native-fbsdk-next版本
旧版本插件可能存在动态配置解析的bug,升级到最新稳定版:
npm install react-native-fbsdk-next@latest # 或 yarn add react-native-fbsdk-next@latest
问题根源分析
你遇到的矛盾(解析后的app.json有值但prebuild报错),大概率是手动调用dotenv.config()导致的环境变量加载时机问题:EAS构建环境中没有.env文件,dotenv尝试加载不存在的文件可能干扰了原生环境变量的注入;改用Expo内置的env对象则能保证变量在配置解析和插件执行阶段都能正确获取。
内容的提问来源于stack exchange,提问作者SteppingHat
相关产品推荐
相关产品推荐

