From fe3aebf87b4123f8b16cdfcb9e2e774e6e0bf0b6 Mon Sep 17 00:00:00 2001 From: Matthieu Lemoine <8517072+matthieulemoine@users.noreply.github.com> Date: Thu, 21 Mar 2019 11:05:48 -0700 Subject: [PATCH] fix: Start Metro packager from project root (#24070) Summary: Fixes #23342. Since Metro [v0.47](https://github.com/facebook/metro/releases/tag/v0.47.0), some babel plugins such as [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver) or [babel-plugin-import-graphql](https://github.com/detrohutt/babel-plugin-import-graphql) fail to resolve files if the packager is started through Xcode. They receive wrong filenames from Babel such as `${projectRoot}/node_modules/react-native/src/index.js` instead of `${projectRoot}/src/index.js`. It happens because the start command of the local-cli is not executed in the projectRoot directory. In this case, the cwd will be `${projectRoot}/node_modules/react-native`. This issue doesn't occur if you start the packager yourself using `node node_modules/react-native/local-cli/cli.js start` from your project root. It comes from this [line](https://github.com/facebook/react-native/blob/b640b6faf77f7af955e64bd03ae630ce2fb09627/scripts/packager.sh#L11). This script changed the working directory to `${projectRoot}/node_modules/react-native` and started Metro from there. Starting Metro from the project root fixes this issue. [iOS] [Fixed] - Start Metro packager from project root Pull Request resolved: https://github.com/facebook/react-native/pull/24070 Differential Revision: D14563996 Pulled By: cpojer fbshipit-source-id: cdeff34610f1ebb5fb7bc82a96f4ac9eec750d16 --- scripts/packager.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/packager.sh b/scripts/packager.sh index 6cab21b669eeb9..e5bb1e903f0282 100755 --- a/scripts/packager.sh +++ b/scripts/packager.sh @@ -4,9 +4,20 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +# scripts directory THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd) +REACT_NATIVE_ROOT="$THIS_DIR/.." +# Application root directory - General use case: react-native is a dependency +PROJECT_ROOT="$THIS_DIR/../../.." # shellcheck source=/dev/null source "${THIS_DIR}/.packager.env" -cd "$THIS_DIR/.." || exit -node "./cli.js" start "$@" + +# When running react-native tests, react-native doesn't live in node_modules but in the PROJECT_ROOT +if [ ! -d "$PROJECT_ROOT/node_modules/react-native" ]; +then + PROJECT_ROOT="$THIS_DIR/.." +fi +# Start packager from PROJECT_ROOT +cd "$PROJECT_ROOT" || exit +node "$REACT_NATIVE_ROOT/cli.js" start "$@"