react-native: NODE_BINARY in .xcode.env not working

Description

I would like to use the .xcode.env to set my node version. My .xcode.env looks like:

export NODE_BINARY=$(command -v node)

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:

export NODE_BINARY=/Users/myuser/.nvm/versions/node/v14.18.1/bin/node

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® Core™ 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

Screen Shot 2022-12-15 at 6 29 09 PM

About this issue

  • Original URL
  • State: open
  • Created 2 years ago
  • Reactions: 5
  • Comments: 22 (8 by maintainers)

Most upvoted comments

Loading nvm from within .xcode.env seems to resolve this for me:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

export NODE_BINARY=$(command -v node)

nvm is common enough that I would suggest this should work out of the box.

The problem is that Xcode scripts works in a different environment than a regular terminal/ Xcode also overrides some basic ENV var that can shadow and mask other variables we might set.

If you don’t have node in the default PATHs, like /usr/local/bin, for example, Xcode is not able to find it. A simple solution could be to create a symlink to node in /usr/local/bin:

sudo ln -s $(command -v node) /usr/local/bin/node

We are investigating better way to handle this, but we haven’t found a robust approach yet, unfortunately. 😦

Apparently this is caused by nvm A less invasive workaround (that breaks nvm):

ln -s $(which node) /usr/local/bin/node

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

Apparently this is caused by nvm A less invasive workaround (that breaks nvm):

ln -s $(which node) /usr/local/bin/node

The problem is that Xcode scripts works in a different environment than a regular terminal/ Xcode also overrides some basic ENV var that can shadow and mask other variables we might set. If you don’t have node in the default PATHs, like /usr/local/bin, for example, Xcode is not able to find it. A simple solution could be to create a symlink to node in /usr/local/bin:

sudo ln -s $(command -v node) /usr/local/bin/node

We are investigating better way to handle this, but we haven’t found a robust approach yet, unfortunately. 😦

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.

Thanks for good answer. The important thing is uninstalling unused node version.

The problem is that Xcode scripts works in a different environment than a regular terminal/ Xcode also overrides some basic ENV var that can shadow and mask other variables we might set.

If you don’t have node in the default PATHs, like /usr/local/bin, for example, Xcode is not able to find it. A simple solution could be to create a symlink to node in /usr/local/bin:

sudo ln -s $(command -v node) /usr/local/bin/node

We are investigating better way to handle this, but we haven’t found a robust approach yet, unfortunately. 😦

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.

@cipolleschi thanks, they are on two lines in the file and it was auto generated like that! i commented out

export NODE_BINARY=$(command -v node)

and updated the other with my node path

export NODE_BINARY=/usr/local/bin/node

project now builds

Thanks

Hey @adamjw3! Your Xcode env has 2 export NODE_BINARY on the same line. That would not work.

You should have either

export NODE_BINARY=$(command -v node)

Or

export NODE_BINARY=/usr/local/bin/node

@lucianomlima yeah, that’s definitely very weird. Can you try add a script phase after building just calling which command? 😕

The problem is that Xcode scripts works in a different environment than a regular terminal/ Xcode also overrides some basic ENV var that can shadow and mask other variables we might set.

If you don’t have node in the default PATHs, like /usr/local/bin, for example, Xcode is not able to find it. A simple solution could be to create a symlink to node in /usr/local/bin:

sudo ln -s $(command -v node) /usr/local/bin/node

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 ,export NVM_DIR=path/to/.nvm approach) but can’t find command, that is a built-in shell library. Sounds weird.