yarn add react-native-configreact-native link react-native-config- Create
.envfiles for each configuration. Ex:.env.dev,.env.prod, etc Ex:
API_ENDPOINT=https://api.myresource.com/dev
ENV=dev
- Add
resValue "string", "build_config_package", "PACKAGE_NAME_FROM_ANDROIDMANIFEST.XML"todefaultConfiginandroid/app/build.gradle
Note: The targets will have suffixes corresponding to the target. Ex: prod: com.company.app, dev: com.company.app.development
- Add
productFlavorsfor different desired targets
android {
defaultConfig { //... }
productFlavors {
dev {
// Pre-compile run ENVFILE=.env.dev
applicationIdSuffix ".development"
}
prod {
// Pre-compile run ENVFILE=.env.prod
}
}
}- Add target dependent keys in
src/<flavor>/res/values/strings.xml(mainis the default config. Use this for prod configuration). Ex:src/dev/res/values/strings.xml,src/main/res/values/strings.xml - Since
react-native-configrequiresENVFILEto be defined in the environment during compile time, make sure to export the variable before assembing. I usually add these scripts to mypackage.json
"scripts": {
// ...
"install:android": "cd android/ && export ENVFILE=.env.dev && ./gradlew installDevDebug && cd .. && yarn start:android",
"start:android": "adb shell am start -n com.bundle.id/.MainActivity",
"assemble:android": "cd android/ && export ENVFILE=.env.prod && ./gradlew assembleProdRelease && cd ..",
"assemble:android:dev": "cd android/ && export ENVFILE=.env.dev && ./gradlew assembleDevRelease && cd ..",
}- Run
yarn assemble:androidto build your prod app andyarn assemble:android:devfor your dev app.
- Instead of multiple schemes for the same target, we are going to add a target for each pipeline. (This will allow for multiple bundle ids, and installing the different target apps to iOS at the same time.)
- Right click your primary target > Duplicate > Rename to
<TargetName>Dev - Move the newly created
<TargetName>Dev-Info.plistinto the project directory ><TargetName>DevBuild Settings > Search "plist" and fix references to plist - General > Set appropriate display name > Set bundle id (same as primary target, append
.<pipeline>ex:.development) - Schemes > Manage Schemes > Delete new scheme that was created for target > Duplicate primary scheme > Rename
<TargetName>Dev - Edit new scheme > Profile > Make sure Executable is set to the new target
.appexecutable - Make sure to follow the Pre-Actions setup and extra instructions for iOS
- Select appropriate scheme before building or running on device
- To keep versions and build in sync across all pipelines, I usually add these scripts into my
package.json
"scripts": {
// ...
"bump:build:ios": "cd ios/ && agvtool next-version -all && cd ..",
"set:build:ios": "cd ios/ && agvtool new-version -all",
"set:version:ios": "cd ios/ && agvtool new-marketing-version"
}To run: yarn bump:build:ios, yarn set:build:ios 23, yarn set:version:ios 1.0.1
- Makes sure to have the correct bundle ids in Firebase to test push notifications in dev before production.
- When linking libraries for iOS, the
react-native linkcommand will be applied to the primary target, and NOT your pipeline targets. These will need to be manually linked.