问题
用过react-native的小伙伴应该回到这个问题,就是在实际的开发中得频繁的改动代码变量,以硬编码的方式来改变环境变量,这样的开发体验十分不好,而且在提测阶段很容易把没改过来的变量提交到主分支,导致最终上线环境没切过来(尽管这种可能性比较小)。有没有一种比较方便的方式,来解决这个环境变量的问题呢?必须有!通过我的一番调研,react-native-config这个项目解决这个问题就很合适,而且它支持多环境变量切换,十分适合后期配置多个环境变量。
怎么使用
安装
yarn add react-native-config
IOS配置
In XCode, in the project navigator, right click Libraries ➜ Add Files to [your project's name] Go to node_modules ➜ react-native-config and add ReactNativeConfig.xcodeproj Expand the ReactNativeConfig.xcodeproj ➜ Products folder In the project navigator, select your project. Add libReactNativeConfig.a to your project's Build Phases ➜ Link Binary With Libraries And go the Build Settings tab. Make sure All is toggled on (instead of Basic) Look for Header Search Paths and add $(SRCROOT)/../node_modules/react-native-config/ios/** as non-recursive
添加库:
将库链接到项目
Android配置
android/settings.gradle
+ include ':react-native-config'
+ project(':react-native-config').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-config/android')
android/app/build.gradle
dependencies {
implementation "com.facebook.react:react-native:+" // From node_modules
+ implementation project(':react-native-config')
}
MainApplication.java
+ import com.lugg.ReactNativeConfig.ReactNativeConfigPackage;
@Override
protected List<ReactPackage> getPackages() {
return Arrays.asList(
new MainReactPackage()
+ new ReactNativeConfigPackage()
);
}
特别注意,需要在build.gradle文件添加(不然没法生效)
apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
多环境配置
- 第一步: 在rn项目根目录,生成.env、.env.release 、.env.production等多环境的配置文件、每一个文件对应一个环境
- 第二步: 在package.json文件里,配置脚本: "android": "react-native run-android", "android-pro": "ENVFILE=.env.production react-native run-android", "android-release": "cd android && ./gradlew assembleRelease", "android-release-pro": "cd android && ENVFILE=.env.production ./gradlew assembleRelease", // 安卓打包 "ios": "react-native run-ios", "ios-pro": "ENVFILE=.env.production react-native run-ios"
默认会执行.env的配置,在运行的时候可以指定环境
注意此处ios在打包时无法使用指令,需要单独配置文件。
IOS多环境文件配置
- 生成文件
Xcode生成scheme文件,每个环境对应一个文件
- 配置: scheme... -> Build -> Pre-actions
cp "{PROJECT_DIR}/../.env" # replace .env.production for your file
- 在build里勾选(这步很重要)
- 使用
在编译的时候要切换 scheme 文件
- 存在问题 ios编译的时候,会把 使用环境文件会覆盖.env文件,建议.env在commit的时候不要提交
使用方法
import Config from "react-native-config";
Config.API_URL; // 'https://myapi.com' // 取值对应的字段,配置文件里数值都是字符
Config.GOOGLE_MAPS_API_KEY; // 'abcdefgh'
使用建议
- 每次切换环境需要先执行一下指令
- ios只有在打包的时候无法使用指令,需要切换scheme文件来指定编译的环境
总结
总体来说,配置这个react-native-config过程比较复杂,但是经过我上面一番配置,就可以实现在RN项目里愉快的使用环境变量了,同时能够支持多环境配置,开发体验还是比较友好的。
由于市面介绍react-native-config的文章质量都不太完善,但遇到问题的时候去多看几次官网的配置介绍,还是比较详细的。
参考地址: github.com/luggit/reac…