Expo如何根据Release Channel加载不同的google-services.json文件
根据Release Channel加载对应google-services.json的方案
完全可以根据不同环境加载对应的google-services.json文件,核心思路是通过动态配置或构建前脚本替换来实现,以下是两种可行方案:
方案一:使用app.config.js动态配置(推荐,适配Expo项目)
Expo支持将静态的app.json替换为动态的app.config.js,通过判断当前的releaseChannel来返回对应环境的配置:
- 将项目根目录的
app.json重命名为app.config.js - 修改文件内容为动态导出配置的函数,根据releaseChannel匹配对应的google-services文件:
module.exports = function (config) { // 获取当前releaseChannel,默认dev环境 const releaseChannel = config.releaseChannel || 'dev'; let googleServicesPath = './google-services-dev.json'; // 根据环境匹配对应文件 switch(releaseChannel) { case 'prod': googleServicesPath = './google-services-prod.json'; break; case 'stage': googleServicesPath = './google-services-stage.json'; break; case 'QA': googleServicesPath = './google-services-qa.json'; break; default: googleServicesPath = './google-services-dev.json'; } return { expo: { // 保留原有其他配置(如name、slug等) android: { googleServicesFile: googleServicesPath, adaptiveIcon: { foregroundImage: "./src/assets/adaptive-icon.png" }, permissions: [ "android.permission.CAMERA", "android.permission.ACCESS_FINE_LOCATION", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.ACTION_BOOT_COMPLETED", "android.permission.RECORD_AUDIO", "com.google.android.gms.permission.AD_ID" ], package: "com.beyondbelievers.awal", versionCode: 1 }, // 其他平台配置... } }; };
- 构建时指定对应的releaseChannel即可自动加载对应文件:
# 构建生产环境 expo build:android --release-channel prod # 构建QA环境 expo build:android --release-channel QA
方案二:构建前脚本替换文件(适配Expo/原生React Native项目)
通过编写脚本,在构建前根据环境变量复制对应环境的google-services.json到默认路径:
- 将各环境文件命名为
google-services-prod.json、google-services-stage.json、google-services-qa.json、google-services-dev.json,放在项目根目录 - 创建脚本文件
swap-google-services.js:
const fs = require('fs'); const path = require('path'); // 从环境变量获取当前环境,默认dev const targetEnv = process.env.RELEASE_CHANNEL || 'dev'; const sourceFilePath = path.resolve(`./google-services-${targetEnv}.json`); const targetFilePath = path.resolve('./google-services.json'); // 复制文件覆盖默认路径 fs.copyFileSync(sourceFilePath, targetFilePath); console.log(`已切换google-services文件至${targetEnv}环境`);
- 在
package.json中添加构建脚本,执行构建前先运行替换脚本:
{ "scripts": { "prebuild:prod": "RELEASE_CHANNEL=prod node swap-google-services.js", "build:prod": "expo build:android --release-channel prod", "prebuild:stage": "RELEASE_CHANNEL=stage node swap-google-services.js", "build:stage": "expo build:android --release-channel stage", "prebuild:qa": "RELEASE_CHANNEL=QA node swap-google-services.js", "build:qa": "expo build:android --release-channel QA", "prebuild:dev": "RELEASE_CHANNEL=dev node swap-google-services.js", "build:dev": "expo build:android --release-channel dev" } }
- 执行对应脚本构建环境:
npm run build:qa
注意事项
- 确保每个环境的google-services.json对应的Firebase项目包名与
package字段一致,否则推送服务会失效 - 构建时务必指定正确的releaseChannel,避免环境混淆
内容的提问来源于stack exchange,提问作者DarkSide77
相关产品推荐
相关产品推荐

