npm install <module>持久性错误? (node-gyp构build?)

我尝试安装jsdom这样的:

$ sudo npm install -g jsdom # OR $ sudo npm install jsdom 

在一些成功的命令之后,安装很快失败,第一个错误消息在[....]

 $ sudo npm install jsdom npm http GET https://registry.npmjs.org/jsdom npm http 304 https://registry.npmjs.org/jsdom [....] > contextify@0.1.7 install /home/yug/Desktop/QGis/WikiAtlas/1_shaded_relief/test/node_modules/jsdom/node_modules/contextify > node-gyp rebuild gyp: /home/yug/.node-gyp/0.10.25/common.gypi not found (cwd: /home/yug/Desktop/QGis/WikiAtlas/1_shaded_relief/test/node_modules/jsdom/node_modules/contextify) while reading includes of binding.gyp gyp ERR! configure error gyp ERR! stack Error: `gyp` failed with exit code: 1 gyp ERR! stack at ChildProcess.onCpExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:337:16) gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:98:17) gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:797:12) gyp ERR! System Linux 3.8.0-35-generic gyp ERR! command "node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" gyp ERR! cwd /home/yug/Desktop/QGis/WikiAtlas/1_shaded_relief/test/node_modules/jsdom/node_modules/contextify gyp ERR! node -v v0.10.25 gyp ERR! node-gyp -v v0.12.2 gyp ERR! not ok npm http 304 https://registry.npmjs.org/domhandler npm http 304 https://registry.npmjs.org/domelementtype npm ERR! contextify@0.1.7 install: `node-gyp rebuild` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the contextify@0.1.7 install script. npm ERR! This is most likely a problem with the contextify 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 contextify npm ERR! There is likely additional logging output above. npm ERR! System Linux 3.8.0-35-generic npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "jsdom" npm ERR! cwd /home/yug/Desktop/QGis/WikiAtlas/1_shaded_relief/test npm ERR! node -v v0.10.25 npm ERR! npm -v 1.3.24 npm ERR! code ELIFECYCLE npm http 304 https://registry.npmjs.org/qs npm http 304 https://registry.npmjs.org/entities .... 

暗示? 这个bug也出现在其他模块中:

  $sudo npm install -g topojson #bug with `contextify@0.1.7 install` error as well. 

在这里输入图像描述

如何解决这个问题?


编辑:我试过sudo apt-get remove --purge nodejs npm topojson然后通过各种方式重新安装。 即使nodejs重新安装成功,错误仍然存​​在 ,所以我猜这是相当的上下文( node.gypcwd ?…)。 删除/重新安装方式尝试:

  • ubuntu_setup.sh
    • 与本地过时的url
    • 与URL更新为https://github.com/joyent/node.git ,
  • sudo add-apt-repository ppa:chris-lea/node.js
  • 和手工git clone https://github.com/joyent/node.git (试用取消)
  • 使用各种其他方式 :
    • way1:ogoing

正如你从评论中发现的那样,这是一个非常普遍的问题。 实际上,jsdom的作者已经在项目的git仓库的README文件中logging了这一点。


TL; DR

你需要在你的机器上安装一个C ++编译器和Python2.7来安装这个依赖于jsdom的symxtify 。 否则,jsdom安装将失败。


从jsdom的Github页面上的README:

Contextify

Contextify是jsdom的依赖项,用于在页面内运行<script>标签。 换句话说,它允许在Node.js中运行的jsdom在假装为浏览器环境而不是服务器的孤立环境中运行JavaScriptstring。 你可以看到这是一个重要的function。

不幸的是,做这种魔术需要C ++。 而在Node.js中,JavaScript使用C ++意味着使用“native模块”。 本地模块在安装时编译,以便它们可以精确地为您的机器工作; 也就是说,你不需要从npm下载一个symxtify二进制文件,而是从npm下载源文件后在本地build立一个。

不幸的是,在npm的安装系统中编译C ++可能会非常棘手,尤其是对于Windows用户。 因此,jsdom最常见的问题之一就是在没有安装正确的编译工具的情况下尝试使用它。 下面是你需要编译Contextify,从而安装jsdom:

视窗

  • 用于Windows的x86版本的Node.js的最新副本,而不是x64版本。
  • Visual C ++ 2010 Express的副本。
  • Python 2.7的副本,安装在C:\ Python27的默认位置。

对此有一些细微的修改可以工作。 例如Visual Studio的完整版本通常可以工作,有时甚至可以获得x64版本的Node.js。 但是这很棘手,所以从基础开始!

苹果电脑

  • XCode需要安装
  • 需要安装“用于XCode的命令行工具”
  • 启动XCode一次以接受许可等,并确保正确安装

Linux的

您将需要安装各种构build工具,如make,Python 2.7和编译器工具链。 如何安装这些将是特定于您的发行版,如果你还没有他们。

在满足上面提到的操作系统的要求之后,再次尝试安装jsdom ,看看是否能解决这个问题。

顺便说一句,你得到同样的问题topojson,因为它依赖于d3依次取决于jsdom ,所以这只是安装jsdom相同的问题。 希望这可以帮助!

– 编辑 –

由于这听起来像你使用Ubuntu,我会build议从下面的命令开始:

 sudo apt-get install build-essential 

这将安装makeg ++等一些工具。 这个软件包和Python2.7可能是您成功安装contextify所需的全部。

似乎我仔细删除了我的计算机上的所有节点相关的文件和文件夹的方式。

0.背景:我以前做过几次不成功的控制台清理

 sudo apt-get remove --purge nodejs npm topojson 

接下来是nodejs种不同的方式重新安装nodejs 。 我尝试了从清理到重新安装的方式,每次都在2到4次之间。

1.terminal清除:我们先以最深的方式清理我的垃圾:

 npm cache clean; bower cache clean; grunt clean; sudo apt-get remove --purge nodejs npm topojson 

但是,我只是注意到, 这个深度清除不会清除/删除已安装的节点模块 ,它们将保持不变

2.手清洗:另外,我推动清洗进一步清洗nodejsnode_modules的手。 我查找了我的电脑上的所有相关文件夹,更接近root(ubuntu: /home/<user>/ )。 我小心删除所有以前安装的全局.../node-modules/文件夹,而不删除本地模块(特定的本地安装,仍然工作)。

3.重新安装:然后下列控制台允许干净的重新安装:

 sudo apt-get update sudo apt-get install python-software-properties python g++ make sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs sudo npm install -g topojson jsdom 

之后,我的文件转换通过npm模块topojson (取决于jsdom本身)工作正常:

 cd /myfolder/ topojson -o output.topo.json input.geo.json 

4.结论:我无法确定为什么,哪个文件/文件夹删除允许成功sudo apt-get install nodejs + sudo npm install -g topojson重新安装。 但是,通过鼠标和recursion删除sudo rm -r [node related folder/file]彻底解锁我的情况深层清理。

/!\ rm -rrecursion删除时非常小心 。 /!\

解决scheme1b:我[可疑] [1] rm -r /home/<user>/local/lib/node_modules/是解锁情况的关键元素。 您可以列出全局( -g )node_modules,然后特别删除相关的( topojson和/或jsdom和/或node-gyp jsdom ),然后重新安装(它们)。

命令:在Ubuntu上,尝试…

  cd /home/<user>/local/lib/node_modules/ #replace <user> by relevant user name to set your cwd ls -1 # give the list of global modules names rm -r /<module_name> #replace <module_name> by relevant name to remove it sudo npm install -g <module_name> #replace <module_name> by relevant name for global install 

注意: topojson依赖于jsdomnpm-gyp jsdom

[1]:没有尝试,但根据我的诊断是有道理的。