在 Openshift 上使用 node-gyp 构建模块
Building modules using node-gyp on Openshift
当尝试在 Openshift 上构建需要像 node-canvas 这样的 node-gyp 模块时,我收到此错误:
> 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
我的理解是node-gyp 正在导入gyp python 没有找到的模块。几周前,我通过将 PYTHONPATH env 变量设置为 node_modules 目录 (/var/lib/.../repo/node_modules/node-gyp/gyp/pylib) 中的那个 gyp python 模块解决了这个问题。这样构建就成功完成了,我可以使用 node-canvas 模块。现在我怀疑 Openshift 发生了一些变化,这种技术不再有效。即使设置了 PYTHONPATH,当我 npm 安装模块时仍然找不到 gyp 模块。知道为什么即使 PYTHONPATH 设置为包含模块的位置也找不到 gyp 模块吗?也许它被忽略了? gyp 文件包含:
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:]))
看不出未使用 PYTHONPATH 的原因(并且无法检查 gyp 文件中的 PYTHONPATH 值,因为它需要 root 权限,我认为我在 Openshift 上没有)。也许 npm 正在以某种方式重置环境?
我通过直接调用 node-gyp 而不是通过 npm install 解决了问题:
node-gyp configure
node-gyp build
node-gyp install
当尝试在 Openshift 上构建需要像 node-canvas 这样的 node-gyp 模块时,我收到此错误:
> 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
我的理解是node-gyp 正在导入gyp python 没有找到的模块。几周前,我通过将 PYTHONPATH env 变量设置为 node_modules 目录 (/var/lib/.../repo/node_modules/node-gyp/gyp/pylib) 中的那个 gyp python 模块解决了这个问题。这样构建就成功完成了,我可以使用 node-canvas 模块。现在我怀疑 Openshift 发生了一些变化,这种技术不再有效。即使设置了 PYTHONPATH,当我 npm 安装模块时仍然找不到 gyp 模块。知道为什么即使 PYTHONPATH 设置为包含模块的位置也找不到 gyp 模块吗?也许它被忽略了? gyp 文件包含:
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:]))
看不出未使用 PYTHONPATH 的原因(并且无法检查 gyp 文件中的 PYTHONPATH 值,因为它需要 root 权限,我认为我在 Openshift 上没有)。也许 npm 正在以某种方式重置环境?
我通过直接调用 node-gyp 而不是通过 npm install 解决了问题:
node-gyp configure
node-gyp build
node-gyp install