From b8c86b8deced01027b609959576ffcf5d2d0f520 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Mon, 22 Jan 2018 12:03:11 -0800 Subject: [PATCH] RN: Revive `react-native-xcode.sh` Reviewed By: mmmulani Differential Revision: D6775989 fbshipit-source-id: da17748c373dd152a743aa1ed8a5f075074415d3 --- scripts/react-native-xcode.sh | 130 ++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 scripts/react-native-xcode.sh diff --git a/scripts/react-native-xcode.sh b/scripts/react-native-xcode.sh new file mode 100644 index 00000000000000..3eb9cf7b50c299 --- /dev/null +++ b/scripts/react-native-xcode.sh @@ -0,0 +1,130 @@ +#!/bin/bash +# Copyright (c) 2015-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. An additional grant +# of patent rights can be found in the PATENTS file in the same directory. + +# Bundle React Native app's code and image assets. +# This script is supposed to be invoked as part of Xcode build process +# and relies on environment variables (including PWD) set by Xcode + +if [[ "$SKIP_BUNDLING" ]]; then + echo "SKIP_BUNDLING enabled; skipping." + exit 0; +fi + +case "$CONFIGURATION" in + *Debug*) + if [[ "$PLATFORM_NAME" == *simulator ]]; then + if [[ "$FORCE_BUNDLING" ]]; then + echo "FORCE_BUNDLING enabled; continuing to bundle." + else + echo "Skipping bundling in Debug for the Simulator (since the packager bundles for you). Use the FORCE_BUNDLING flag to change this behavior." + exit 0; + fi + else + echo "Bundling for physical device. Use the SKIP_BUNDLING flag to change this behavior." + fi + + DEV=true + ;; + "") + echo "$0 must be invoked by Xcode" + exit 1 + ;; + *) + DEV=false + ;; +esac + +# Path to react-native folder inside node_modules +REACT_NATIVE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +# Xcode project file for React Native apps is located in ios/ subfolder +cd "${REACT_NATIVE_DIR}"/../.. + +# Define NVM_DIR and source the nvm.sh setup script +[ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.nvm" + +# Define entry file +if [[ -s "index.ios.js" ]]; then + ENTRY_FILE=${1:-index.ios.js} +else + ENTRY_FILE=${1:-index.js} +fi + +if [[ -s "$HOME/.nvm/nvm.sh" ]]; then + . "$HOME/.nvm/nvm.sh" +elif [[ -x "$(command -v brew)" && -s "$(brew --prefix nvm)/nvm.sh" ]]; then + . "$(brew --prefix nvm)/nvm.sh" +fi + +# Set up the nodenv node version manager if present +if [[ -x "$HOME/.nodenv/bin/nodenv" ]]; then + eval "$("$HOME/.nodenv/bin/nodenv" init -)" +fi + +[ -z "$NODE_BINARY" ] && export NODE_BINARY="node" + +[ -z "$CLI_PATH" ] && export CLI_PATH="$REACT_NATIVE_DIR/local-cli/cli.js" + +[ -z "$BUNDLE_COMMAND" ] && BUNDLE_COMMAND="bundle" + +if [[ -z "$BUNDLE_CONFIG" ]]; then + CONFIG_ARG="" +else + CONFIG_ARG="--config $(pwd)/$BUNDLE_CONFIG" +fi + +nodejs_not_found() +{ + echo "error: Can't find '$NODE_BINARY' binary to build React Native bundle" >&2 + echo "If you have non-standard nodejs installation, select your project in Xcode," >&2 + echo "find 'Build Phases' - 'Bundle React Native code and images'" >&2 + echo "and change NODE_BINARY to absolute path to your node executable" >&2 + echo "(you can find it by invoking 'which node' in the terminal)" >&2 + exit 2 +} + +type $NODE_BINARY >/dev/null 2>&1 || nodejs_not_found + +# Print commands before executing them (useful for troubleshooting) +set -x +DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH + +if [[ "$CONFIGURATION" = "Debug" && ! "$PLATFORM_NAME" == *simulator ]]; then + PLISTBUDDY='/usr/libexec/PlistBuddy' + PLIST=$TARGET_BUILD_DIR/$INFOPLIST_PATH + IP=$(ipconfig getifaddr en0) + if [ -z "$IP" ]; then + IP=$(ifconfig | grep 'inet ' | grep -v ' 127.' | cut -d\ -f2 | awk 'NR==1{print $1}') + fi + + if [ -z ${DISABLE_XIP+x} ]; then + IP="$IP.xip.io" + fi + + $PLISTBUDDY -c "Add NSAppTransportSecurity:NSExceptionDomains:localhost:NSTemporaryExceptionAllowsInsecureHTTPLoads bool true" "$PLIST" + $PLISTBUDDY -c "Add NSAppTransportSecurity:NSExceptionDomains:$IP:NSTemporaryExceptionAllowsInsecureHTTPLoads bool true" "$PLIST" + echo "$IP" > "$DEST/ip.txt" +fi + +BUNDLE_FILE="$DEST/main.jsbundle" + +$NODE_BINARY $CLI_PATH $BUNDLE_COMMAND \ + $CONFIG_ARG \ + --entry-file "$ENTRY_FILE" \ + --platform ios \ + --dev $DEV \ + --reset-cache \ + --bundle-output "$BUNDLE_FILE" \ + --assets-dest "$DEST" \ + $EXTRA_PACKAGER_ARGS + +if [[ $DEV != true && ! -f "$BUNDLE_FILE" ]]; then + echo "error: File $BUNDLE_FILE does not exist. This must be a bug with" >&2 + echo "React Native, please report it here: https://github.com/facebook/react-native/issues" + exit 2 +fi