Skip to content

Instantly share code, notes, and snippets.

@powerc9000
Last active August 19, 2018 15:38
Show Gist options
  • Save powerc9000/1f020a6509e01272c57ce22f14afdcbc to your computer and use it in GitHub Desktop.
Save powerc9000/1f020a6509e01272c57ce22f14afdcbc to your computer and use it in GitHub Desktop.
Globals In React Native

Recently I ran into a problem in React Native.

I wanted to be able to have more granular control of my build besides React Native's __DEV__.

Our QA people need to have a few tools at their disposal to run the APP vs our live and test servers. I don't want to make them download the project on Github and run it. That would force them onto a mac for iOS builds. I don't want to ship the app with __DEV__ on. It would be quite complex to have them connect to some dev package server to run the app A third option was needed. There should be a __QA__ flag. This way I can release the APP in without __DEV__ but keep some QA features I want. The naive way would be to have something like a globals.js file that you include and edit the file for different releases. eg.

//for production release
GLOBAL.__QA__ = false;
GLOBAL.__PROD__ = true;

But the one thing I don't want to do is EVER edit code manually for different releases. It should all be handled on the command line with make

I wish react-native had some easy way to define globals from the command line. like the C preproccessor defines eg.

#ifdef SOME_FLAG
...
#endif

and then you can switch your flags on and off from command line with gcc file.cpp -D SOME_FLAG=1

As side note I make use of defines in my AppDelegate.m so I don't have to comment out code for production or release.

#if defined(DEBUG)
  jsCodeLocation = [NSURL URLWithString:@"http://127.0.0.1:8081/index.ios.bundle?platform=ios&dev=true"];
#else
  /**
   * OPTION 2
   * Load from pre-bundled file on disk. The static bundle is automatically
   * generated by "Bundle React Native code and images" build step.
   */

  jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif

So the problem is:

I want to have flags for the code without manually having to edit files for releases.

I came up with a solution I am okay with for right now.

I start with a globals.js file and include that in my index.ios.js and index.android.js files.

Then I made files for each of the different enviroments I wanted to support. globals_dev.js globals_qa.js globals_prod.js

All with the 2 flags I want in correctly set eg for globals_qa.js

GLOBAL.__QA__ = true;
GLOBAL.__PROD__ = false;

Then when I go to create a build for anything I concat the correct globals_x.js into globals.js to set all the flags to the values I wanted.

It looks something like this.

cat globals_x.js > globals.js

So my Makefile instruction for qa might look something like this. (remember I want QA to be a production build with 1 flag set)

(I also made custom builder and uploader scripts for iOS but ill save that for a later post)

QA:
  cat globals_dev.js > globals.js
  cd android && ./gradlew assembleRelease
  ./scripts/build_ios.sh

BOOM now with this you can setup any enviroment you want with as many flags as you want to support!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment