When trying to build modules that require node-gyp like node-canvas on Openshift I get this error:
> canvas@1.2.3 install /var/lib/.../repo/node_modules/canvas
> node-gyp rebuild
Traceback (most recent call last):
File "/opt/rh/v8314/root/usr/bin/gyp", line 15, in <module>
import gyp
ImportError: No module named gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/opt/rh/nodejs010/root/usr/lib/node_modules/node-gyp/lib/configure.js:343:16)
gyp ERR! stack at ChildProcess.emit (events.js:98:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:820:12)
gyp ERR! System Linux 2.6.32-504.16.2.el6.x86_64
gyp ERR! command "node" "/opt/rh/nodejs010/root/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /var/lib/.../repo/node_modules/canvas
gyp ERR! node -v v0.10.35
gyp ERR! node-gyp -v v1.0.2
gyp ERR! not ok
npm ERR! canvas@1.2.3 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the canvas@1.2.3 install script.
npm ERR! This is most likely a problem with the canvas package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-gyp rebuild
npm ERR! You can get their info via:
npm ERR! npm owner ls canvas
npm ERR! There is likely additional logging output above.
npm ERR! System Linux 2.6.32-504.16.2.el6.x86_64
npm ERR! command "node" "/opt/rh/nodejs010/root/usr/bin/npm" "install" "node-canvas-1.2.3"
npm ERR! cwd /var/lib/.../app-root/runtime/repo
npm ERR! node -v v0.10.35
npm ERR! npm -v 1.4.28
npm ERR! code ELIFECYCLE
npm ERR! not ok code 0
My understanding is that node-gyp is importing the gyp python module that is not found. I solved this issue some weeks ago by setting the PYTHONPATH env variable to that gyp python module in my node_modules directory (/var/lib/.../repo/node_modules/node-gyp/gyp/pylib). That way the build was completed successfully and I could use the node-canvas module. Now I suspect something changed in Openshift and this technique is not working anymore. Even though PYTHONPATH is set, the gyp module still cannot be found when I npm install the module. Any idea why the gyp module cannot be found even though PYTHONPATH is set to include the location of the module? Maybe it is ignored? The gyp file contains:
import sys
# TODO(mark): sys.path manipulation is some temporary testing stuff.
try:
import gyp
except ImportError, e:
import os.path
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'pylib'))
import gyp
if __name__ == '__main__':
sys.exit(gyp.main(sys.argv[1:]))
Can't see the reason why PYTHONPATH is not used (and can't check PYTHONPATH value in gyp file as it would require root permissions, which I don't think I have on Openshift). Maybe npm is somehow resetting the env?