解决 node-gyp rebuild 时的假死问题

Published at 14th November, 2014

最近 npm install 时候经常遇到在 node-gyp rebuild 那里卡很久的情况(大于十分钟),于是研究了一下输出的错误日志解决了这个问题,在这里分享一下。

首先,请检查 node-gyp 需要的 Python 和编译工具链是否已安装:

On Unix:

  • python (v2.7 recommended, v3.x.x is not supported)
  • make
  • A proper C/C++ compiler toolchain, like GCC

如果检查下来这几项都没问题的话,可能是 Node.js 源码缺失的原因。

这其实又是一个天朝独有的问题,主要原因是 node-gyp 编译时候需要 Node.js 源码来提供头文件,所以它会先尝试下载 Node.js 源码;而在天朝墙外 CDN 经常抽风,有时候下载 Node.js 源码奇慢无比,如我这里就只有 3KB/s,那么自然要卡很久。

解决方法1:自己下载源码

使用天朝加速下载工具(比如迅雷等)把 Node.js 的源码下载到本地,或者下载中国镜像提供的源码,然后提取给 node-gyp。

下载的源码包版本一定要和自己的 Node.js 二进制的版本一致,否则 node-gyp 还是会尝试重新下载源码的。你可以在终端下输入 node -v 查看你本机 Node.js 的版本。

以下命令从淘宝的 Node.js 源码镜像下载正确版本源码,并自动提取给 node-gyp 使用:

node-gyp install --dist-url https://npm.taobao.org/mirrors/node

如果没有 node-gyp 命令,或以上命令无法工作,可以使用以下代码手工下载提取:

# 获得 nodejs 版本号
NODE_VERSION=`node -v | cut -d'v' -f 2`

# 下载源码包
wget https://npm.taobao.org/mirrors/node/v$NODE_VERSION/node-v$NODE_VERSION.tar.gz

# 删除现有内容不完整的目录
rm -rf ~/.node-gyp
mkdir ~/.node-gyp

# 解压缩并重命名到正确格式
tar zxf node-v$NODE_VERSION.tar.gz -C ~/.node-gyp
mv ~/.node-gyp/node-v$NODE_VERSION ~/.node-gyp/$NODE_VERSION

# 创建一个标记文件
printf "9\n">~/.node-gyp/$NODE_VERSION/installVersion

解决方法2:使用 cnpm(推荐)

cnpm 是淘宝提供的 npm 中国镜像加速,cnpm 不仅可以加速 npm 上包的下载,也提供了镜像加速 Node.js 源码的下载。

详情请戳:https://npm.taobao.org/

Comments