react-native-config在release构建中无法读取.env配置问题
react-native-config 多Flavor场景Release构建读不到.env配置排查方案
核心排查点与对应修复
- 首先检查Gradle配置是否覆盖Release变体
绝大多数场景下该问题是因为只给Debug构建配置了.env注入逻辑,Release构建未关联对应环境文件。- 确认
android/app/build.gradle中react-native-config的引入位置正确,必须放在com.android.application、com.facebook.react插件引入之后,不要把该引入语句放在debug专属判断逻辑中:apply plugin: "com.android.application" apply plugin: "com.facebook.react" // 全局生效,不要包裹在buildType判断里 apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" - 不要只在debug buildType下配置env路径,需要在
applicationVariants遍历逻辑中给所有flavor+buildType的组合绑定对应env文件,示例配置:android { // 省略其他基础配置 flavorDimensions "env" productFlavors { dev { dimension "env" } staging { dimension "env" } prod { dimension "env" } } applicationVariants.all { variant -> // 按flavor名匹配根目录下的.env.xxx文件,命名需完全对应 def targetEnvFile = rootProject.file(".env.${variant.flavorName}") if (targetEnvFile.exists()) { variant.javaCompileProvider.get().options.compilerArgs += [ "-AenvFile=${targetEnvFile.absolutePath}" ] } } }
- 确认
- 检查混淆规则是否遗漏
Release构建默认开启R8/ProGuard代码混淆裁剪,未加白名单规则会把BuildConfig中的配置字段、react-native-config相关类移除,导致读取为空。
在android/app/proguard-rules.pro中添加如下规则:-keep class 你自己的应用包名.BuildConfig { *; } -keep class com.lugg.ReactNativeConfig.** { *; } -dontwarn com.lugg.ReactNativeConfig.** - 清理全量构建缓存后重打包
配置修改后如果直接执行打包命令,会复用旧的构建缓存导致配置不生效,打包前执行全量清理:- 安卓端:
cd android && ./gradlew clean - iOS端:清理Xcode DerivedData缓存,执行
cd ios && pod install后重新构建
- 安卓端:
- 校验env文件位置与命名
所有.env文件必须放在项目根目录(和package.json同级),文件名后缀必须和对应flavor名大小写完全一致,比如flavor名为prod时,对应文件必须命名为.env.prod,不能出现.env.Prod、.env.production这类不匹配的命名。 - iOS端Release Scheme配置校验
如果是iOS平台多Scheme场景,需要确认每个Scheme的Release模式下也配置了env注入脚本:在Xcode的Build Phases中,将react-native-config的环境读取脚本放在「Bundle React Native code and images」阶段之前,脚本内容参考:set -e echo ".env.${SCHEME_NAME}" > /tmp/envfile "${SRCROOT}/../node_modules/react-native-config/ios/ReactNativeConfig/BuildXCConfig.rb" "${SRCROOT}/.." "${SRCROOT}/tmp/envfile" - 版本兼容问题
如果项目开启了Hermes引擎,将react-native-config升级到1.5.0及以上版本,旧版本存在Hermes Release模式下配置读取为空的兼容问题。
内容的提问来源于stack exchange,提问作者Amal Mohan N
相关产品推荐
相关产品推荐

