From 03952ba3dfd94e2e752ca0e36c49eb9a126787ac Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Mon, 11 Aug 2025 05:12:43 -0700 Subject: [PATCH] Fix missing path escape patterns in Xcode scripts for projects with spaces (#53194) Summary: When running a project in a path that contains any spaces, the scripts have several escape patterns that don't handle this path correctly. For example, `"/absolute/path/with spaces"` may be rendered as `/absolute/path/with spaces` and this shows as an output error such as `No such file or directory /absolute/path/with` This was likely a longstanding issue, but is unexpected for some beginners that first try out React Native. While it's not recommended to create a path like this, it's certainly not hard to make this mistake. ## Changelog: [IOS] [FIXED] - fix scripts for paths containing whitespaces Pull Request resolved: https://github.com/facebook/react-native/pull/53194 Test Plan: tested locally; create a React Native or Expo project in a folder containing a space (e.g. `/my/path/with spaces/new-app` and build the project. With changes applied, the build should succeed. (There's related failures in `expo/expo` that need fixing too) Reviewed By: robhogan Differential Revision: D79993537 Pulled By: cipolleschi fbshipit-source-id: b32697ce2405c403c410b3ceaed7e161e4a48537 --- .../generate-artifacts-executor-test.js.snap | 12 ++++++------ .../generateReactCodegenPodspec.js | 6 +++--- packages/react-native/scripts/react-native-xcode.sh | 4 ++-- .../react-native/scripts/xcode/with-environment.sh | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index a2c4e530b21..acb69b45e62 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -497,9 +497,9 @@ export RCT_SCRIPT_APP_PATH=\\"$RCT_SCRIPT_POD_INSTALLATION_ROOT/..\\" export RCT_SCRIPT_OUTPUT_DIR=\\"$RCT_SCRIPT_POD_INSTALLATION_ROOT\\" export RCT_SCRIPT_TYPE=\\"withCodegenDiscovery\\" -SCRIPT_PHASES_SCRIPT=\\"$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh\\" -WITH_ENVIRONMENT=\\"$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh\\" -/bin/sh -c \\"$WITH_ENVIRONMENT $SCRIPT_PHASES_SCRIPT\\" +export SCRIPT_PHASES_SCRIPT=\\"$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh\\" +export WITH_ENVIRONMENT=\\"$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh\\" +/bin/sh -c '\\"$WITH_ENVIRONMENT\\" \\"$SCRIPT_PHASES_SCRIPT\\"' SCRIPT } @@ -976,9 +976,9 @@ export RCT_SCRIPT_APP_PATH=\\"$RCT_SCRIPT_POD_INSTALLATION_ROOT/..\\" export RCT_SCRIPT_OUTPUT_DIR=\\"$RCT_SCRIPT_POD_INSTALLATION_ROOT\\" export RCT_SCRIPT_TYPE=\\"withCodegenDiscovery\\" -SCRIPT_PHASES_SCRIPT=\\"$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh\\" -WITH_ENVIRONMENT=\\"$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh\\" -/bin/sh -c \\"$WITH_ENVIRONMENT $SCRIPT_PHASES_SCRIPT\\" +export SCRIPT_PHASES_SCRIPT=\\"$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh\\" +export WITH_ENVIRONMENT=\\"$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh\\" +/bin/sh -c '\\"$WITH_ENVIRONMENT\\" \\"$SCRIPT_PHASES_SCRIPT\\"' SCRIPT } diff --git a/packages/react-native/scripts/codegen/generate-artifacts-executor/generateReactCodegenPodspec.js b/packages/react-native/scripts/codegen/generate-artifacts-executor/generateReactCodegenPodspec.js index d5d932229dc..554dbca091f 100644 --- a/packages/react-native/scripts/codegen/generate-artifacts-executor/generateReactCodegenPodspec.js +++ b/packages/react-native/scripts/codegen/generate-artifacts-executor/generateReactCodegenPodspec.js @@ -83,9 +83,9 @@ export RCT_SCRIPT_APP_PATH="$RCT_SCRIPT_POD_INSTALLATION_ROOT/${relativeAppPath. export RCT_SCRIPT_OUTPUT_DIR="$RCT_SCRIPT_POD_INSTALLATION_ROOT" export RCT_SCRIPT_TYPE="withCodegenDiscovery" -SCRIPT_PHASES_SCRIPT="$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh" -WITH_ENVIRONMENT="$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh" -/bin/sh -c "$WITH_ENVIRONMENT $SCRIPT_PHASES_SCRIPT" +export SCRIPT_PHASES_SCRIPT="$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh" +export WITH_ENVIRONMENT="$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh" +/bin/sh -c '"$WITH_ENVIRONMENT" "$SCRIPT_PHASES_SCRIPT"' SCRIPT`; } diff --git a/packages/react-native/scripts/react-native-xcode.sh b/packages/react-native/scripts/react-native-xcode.sh index b5d50ccb4bb..1dcdf55e190 100755 --- a/packages/react-native/scripts/react-native-xcode.sh +++ b/packages/react-native/scripts/react-native-xcode.sh @@ -10,7 +10,7 @@ # Print commands before executing them (useful for troubleshooting) set -x -e -DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH +DEST="$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH" # Enables iOS devices to get the IP address of the machine running Metro if [[ ! "$SKIP_BUNDLING_METRO_IP" && "$CONFIGURATION" = *Debug* && ! "$PLATFORM_NAME" == *simulator ]]; then @@ -59,7 +59,7 @@ esac # Path to react-native folder inside node_modules REACT_NATIVE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # Most projects have their project root, one level up from their Xcode project dir (the "ios" directory) -PROJECT_ROOT=${PROJECT_ROOT:-"$PROJECT_DIR/.."} +PROJECT_ROOT="${PROJECT_ROOT:-"$PROJECT_DIR/.."}" cd "$PROJECT_ROOT" || exit diff --git a/packages/react-native/scripts/xcode/with-environment.sh b/packages/react-native/scripts/xcode/with-environment.sh index c6bd62c87fc..d2ddf3c02ca 100755 --- a/packages/react-native/scripts/xcode/with-environment.sh +++ b/packages/react-native/scripts/xcode/with-environment.sh @@ -43,5 +43,5 @@ fi # Execute argument, if present if [ -n "$1" ]; then - $1 + "$1" fi