-
Notifications
You must be signed in to change notification settings - Fork 24.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NODE_BINARY in .xcode.env not working #35657
Comments
in my case it was NVM. Either let nvm go or reconfigure it In your build phases scripts 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 |
In my case I had to add shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\nexport NODE_BINARY=$(command -v node)\n"; Running |
Apparently this is caused by
|
nvm is common enough that I would suggest this should work out of the box. |
Loading nvm from within export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
export NODE_BINARY=$(command -v node) |
In my Xcode build logs show me this error:
But after errors, show "Now using node v20.7.0." and this happen too with Upload Debug Symbols to Sentry build phase. |
The problem is that Xcode scripts works in a different environment than a regular terminal/ If you don't have node in the default PATHs, like
We are investigating better way to handle this, but we haven't found a robust approach yet, unfortunately. :( |
In my case, Xcode can find node (using the , |
@lucianomlima yeah, that's definitely very weird. |
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" --no-use
nvm use default # I need to put this because when use nvm current returns none
export NODE_BINARY=$NVM_DIR/versions/node/v20.7.0/bin/node
echo $NVM_DIR # Prints /Users/luciano.lima/.nvm
echo $NODE_BINARY # Prints /Users/luciano.lima/.nvm/versions/node/v20.7.0/bin/node And, on Xcode log, I have these messages: Now using node v20.7.0 (npm v10.1.0)
/Users/luciano.lima/.nvm # echo $NVM_DIR
/Users/luciano.lima/.nvm/versions/node/v20.7.0/bin/node # echo $NODE_BINARY
Node found at: /Users/luciano.lima/.nvm/versions/node/v20.7.0/bin/node And some time later: + type node
+ echo 'error: node not found! Modules won'\''t be collected.' 'Please export NODE_BINARY in '\''Build Phase'\'' - '\''Bundle React Native code and images'\''' 'to an absolute path of your node binary. Check your node path by '\''which node'\''.'
error: node not found! Modules won't be collected. Please export NODE_BINARY in 'Build Phase' - 'Bundle React Native code and images' to an absolute path of your node binary. Check your node path by 'which node'.
+ exit 0
Command PhaseScriptExecution emitted errors but did not return a nonzero exit code to indicate failure So, even using an absolute path to NODE_BINARY, build script phase fails. The only way that make things works is with symlink like @cipolleschi suggests. Now my export NODE_BINARY=/usr/local/bin/node And now finally works. 🤷 |
From which script phase the message:
arrives? I have no memory of any of our scripts emitting that message! Could it be a third party library? |
It's from @sentry/react-native and my script build phase is export SENTRY_PROPERTIES=sentry.properties
export EXTRA_PACKAGER_ARGS="--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map"
set -e
WITH_ENVIRONMENT="../node_modules/react-native/scripts/xcode/with-environment.sh"
REACT_NATIVE_XCODE="../node_modules/react-native/scripts/react-native-xcode.sh"
SENTRY_CLI="../node_modules/@sentry/cli/bin/sentry-cli"
/bin/sh -c "$WITH_ENVIRONMENT \"$SENTRY_CLI react-native xcode $REACT_NATIVE_XCODE\""
/bin/sh ../node_modules/@sentry/react-native/scripts/collect-modules.sh Maybe the last line is where the problem is? I'll try to add |
i think i'm getting a similar issue
My .xcode.env is
but my node path when running How can i fix this? |
Hey @adamjw3! Your Xcode env has 2 You should have either
Or
|
@cipolleschi thanks, they are on two lines in the file and it was auto generated like that! i commented out
and updated the other with my node path
project now builds Thanks |
What worked for us was to get the NVM directory: We have NVM setup in our README so could reasonably expect local devs to have that set, and doesn't to explicitly state the node version. Then, it runs same locally and on CircleCi. |
This analysis is correct. I solved this problem by completely uninstalling node and then downloading the .pkg installation from the node.js ,because the installation location of the installation package is /usr/local/bin/node by default. |
Just adding more info in case it's helpful. I'm using Homebrew and this is happening too, right after downgrading from node 20 to node 18. Not using Expo, RN 0.70.6. Here are some of the xcode logs when the error occurs: ...Desktop/Inventory/ios/Pods/../../node_modules/react-native/React/FBReactNativeSpec/../../scripts/xcode/with-environment.sh: line 35: .xcode.env: command not found I have .xcode.env inside my ios folder with the line: export NODE_BINARY=$(command -v node). command -v node prints out the correct path(/opt/homebrew/opt/node@18/bin/node). Switching out $(command -v node) with that path works. I get now that Xcode runs in a different environment that doesn't have access to variables that the terminal has, but it was working before I changed the node version, and that is all I changed, so it seems weird that it suddenly wouldn't work. |
Note, this other issue seems to suggest the .xcode.env thing will fix it, so just referencing here that that solution does not work: #33695 |
This fixed the issue for me https://stackoverflow.com/a/66497247/6590549. I had a symlinked version of node that was node longer actually installed via nvm. |
Thanks for good answer. The important thing is uninstalling unused node version. |
I created an For context: I'm lazy-loading |
I just spent half a day debugging a strange problem. XCode seems to be exiting with error code 65 due to the autogenerated
Apologies for the long description, just trying to paint as detailed a picture so something clicks for someone who knows the picture deeper. This behaviour is worrisome because its an obscure problem that might revisit in a couple of months and burn another half day. Are there any preventive measures I can take? For example I was thinking of making |
@ArindamRayMukherjee Don't worry about Don't commit it. First, double check that it's not already committed in the repo -- it maybe ignored by git now, but perhaps someone committed it by mistake before. If it in the repo, my recommendation is to open a PR to remove it. |
@vinnyA3 Committing |
@ArindamRayMukherjee why the local file is causing that specific error, I'm not sure. There must be more info in the log view of xcode. I have had issues the bundle phase script failing, and the source was because of the default xcode env file -- maybe it's the same error? Not sure off top of my head. That said, I did find out that, depending how the project is configured, pod install can auto-generate the file: It's not clear to me why this file is autogenerated in the first place, but if you check that thread, there are solutions |
@vinnyA3 Many thanks! Yes that thread exactly mentions this! And I've gone for the simple solution of removing the file in my yarn commands. |
On 0.71.17, we found the only way to solve this error was to temporarily delete .xcode.env. You are able to add it back after a successful build and the rebuild without issues. |
I got the following setup on my local:
I did almost the same modifications as @lucianomlima (here) to my
and it's working! 🎉 |
The issue for me seems to be that bash scripts are executing differently when run via an xcode build vs triggering a build from the CLI. Specifically, the issue seems to be that
export NODE_BINARY=$(command -v node)
echo ">>>>>>>>> node binary path: $NODE_BINARY"
echo ">>>>>>>>>> PATH $PATH" If you look at the build logs in Xcode you'll see that xcode's paths/Applications/Xcode.app/Contents/...
...
/Applications/Xcode.app/Contents/Developer/usr/local/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin terminal paths...
# this is the big one for me 👇
/opt/homebrew/bin
...
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
... In my case, I have Basically, you either need to make sure |
When xcode evaluates your .xcode.env it is not doing so from your USER env where node is installed via brew an version managers, but from a "clean shell" that does not know about any of your custom paths. It only works if node is available from /usr/bin, /usr/local/bin etc. You should set up your own NODE_BINARY by running this from your command line: I would argue that this default setup with "export NODE_BINARY=$(command -v node)" in .xcode.env is incorrect and should be changed to something that respects the users environment, perhaps as a step at yarn install. |
Not seeing this posted anywhere. For me harcoding the path could work for some build processes but not for others, like React Native Code & Images. My path was What worked immediately for me after trying basically everything else was uninstall node via brew (it was installed via brew) Then each build process was able to find node via |
We landed a change in main that should fix this for good: aa35a21 |
@cipolleschi That solution looks like it works only if you have no xcode.env file. What about regenerating from existing projects or nodejs version upgrades? For scalability across versions of nodejs or projects that have wrong version linked it would be best to do and diff on the binary path and compare it with the current output. Make sure it's exact then either replace it or skip. Also we could confirm it matches the .node-version of the project. -- Recently had this problem went from node20 on my local clone and ran a pod install to test. Then ran into the nodejs issue. I symlinked fnm node version 20. it kept failing due to the mismatch or nodejs binaries (no yarn) on 20 vs 18. |
@FrederickEngelhardt this can't be done. If users customize their .xcode.env file with other configurations, we would wipe that away. Clearly, not a great experience. |
Description
I would like to use the .xcode.env to set my node version. My .xcode.env looks like:
When I execute this command in a terminal window, it returns the proper node version. I've tested, and the only way I can set the node version is using Build Phases -> Bunde React Native Code and Images -> and exporting NODE_BINARY in the shell commands there to the absolute path:
Can anyone suggest why NODE_BINARY is not being set through the .xcode.env file? Do I have to take any extra steps to use this during archive?
Version
0.70.4
Output of
npx react-native info
System:
OS: macOS 12.6
CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Memory: 23.84 MB / 32.00 GB
Shell: 3.2.57 - /bin/bash
Binaries:
Node: 14.18.1 - ~/.nvm/versions/node/v14.18.1/bin/node
Yarn: 1.22.18 - ~/.nvm/versions/node/v14.18.1/bin/yarn
npm: 6.14.15 - ~/.nvm/versions/node/v14.18.1/bin/npm
Watchman: 2022.03.21.00 - /usr/local/bin/watchman
Managers:
CocoaPods: 1.11.3 - /Users/micahsklut/.rbenv/shims/pod
SDKs:
iOS SDK:
Platforms: DriverKit 22.2, iOS 16.2, macOS 13.1, tvOS 16.1, watchOS 9.1
Android SDK:
API Levels: 29, 30, 31
Build Tools: 29.0.2, 30.0.2, 30.0.3, 31.0.0
System Images: android-29 | Intel x86 Atom_64, android-29 | Google APIs Intel x86 Atom_64, android-30 | Google APIs Intel x86 Atom
Android NDK: Not Found
IDEs:
Android Studio: 2021.3 AI-213.7172.25.2113.9123335
Xcode: 14.2/14C18 - /usr/bin/xcodebuild
Languages:
Java: 1.8.0_292 - /usr/bin/javac
npmPackages:
@react-native-community/cli: Not Found
react: 18.1.0 => 18.1.0
react-native: ^0.70.4 => 0.70.6
react-native-macos: Not Found
npmGlobalPackages:
react-native: Not Found
Steps to reproduce
Run Archive. The system node is being used, unless I set it as explained above.
Snack, code example, screenshot, or link to a repository
The text was updated successfully, but these errors were encountered: