在Windows系统中全局安装npm导致出现"npm ERR! extraneous"错误

122

我正在尝试网站'http://tech.pro/tutorial/1190/package-managers-an-introductory-guide-for-the-uninitiated-front-end-developer#front_end_developers'上的一些“菜谱示例”。

现在你不需要去那里看,但我觉得分享这个网站可能是好的。

到目前为止,一切都很好,直到涉及全局安装的部分。

当涉及尝试全局安装某些软件包时,我卡住了。

我为测试全局安装某个软件包所做的事情:

  1. 创建测试目录grunttest

  2. 在该目录中:

    npm install -g jshint

我可以看到的输出:

 npm http GET https://registry.npmjs.org/jshint
 npm http 304 https://registry.npmjs.org/jshint
 ...
 npm http 304 https://registry.npmjs.org/string_decoder
 C:\Program Files\nodejs\node_modules\npm\jshint -> C:\Program Files\nodejs\node_modules\npm\node_modules\jshinnt
 jshint@2.4.4 C:\Program Files\nodejs\node_modules\npm\node_modules\jshint
 ├── console-browserify@0.1.6
 ├── exit@0.1.2
 ├── underscore@1.4.4
 ├── shelljs@0.1.4
 ├── minimatch@0.2.14 (sigmund@1.0.0, lru-cache@2.5.0)
 ├── cli@0.4.5 (glob@3.2.9)
 └── htmlparser2@3.3.0 (domelementtype@1.1.1, domutils@1.1.6, domhandler@2.1.0, readable-stream@1.0.26-2)

我刚刚意识到304状态码,它应该是正常的,因为它只是表明该资源自上次安装以来没有被修改(几分钟前)。

检查jshint是否存在:

`npm -global list`

输出:

npm@1.4.3 C:\Program Files\nodejs\node_modules\npm
├── abbrev@1.0.4
├── ansi@0.2.1
├─...
├──
├── graceful-fs@2.0.2
├── inherits@2.0.1
├── ini@1.1.0
├─┬ init-package-json@0.0.14
│ └── promzard@0.2.1
├─┬ jshint@2.4.4 extraneous
│ ├─┬ cli@0.4.5
│ │ └─┬ glob@3.2.9
│ │   └── inherits@2.0.1
│ ├── console-browserify@0.1.6
│ ├── exit@0.1.2
│ ├─┬ htmlparser2@3.3.0
│ │ ├── domelementtype@1.1.1
│ │ ├── domhandler@2.1.0
│ │ ├── domutils@1.1.6
│ │ └─┬ readable-stream@1.0.26-2
│ │   └─... ├── text-table@0.2.0
├── uid-number@0.0.3
└── which@1.0.5

**npm ERR! extraneous: jshint@2.4.4 C:\Program Files\nodejs\node_modules\npm\node_modules\jshint npm**

问题:

  1. 为什么我会收到 npm ERR! extraneous ... 的错误信息?
  2. 这是什么意思?
  3. 我该如何解决这个问题?

信息:

我正在使用 Windows 7 操作系统的电脑,使用的是 cygwin 作为 shell。 当我尝试运行 jshint(jshint someTestfile.js)时,当然会失败。

7个回答

216

npm ERR! extraneous 意味着一个包已被安装,但未列在你的项目的 package.json 中。

由于您正在列出全局安装的软件包,这将给您带来许多可以简单忽略的冗余错误,因为大部分全局安装的内容都不会在您的项目的package.json中。


1
嗨!感谢您的回答。这是否意味着我实际上应该能够执行“jshint”呢? - Meru
ТГБуА«сђѓУ┐љУАїjshint myfile.jsт║ћУ»Цтюеmyfile.jsСИіУ┐љУАїjshintсђѓ - Kyle Robinson Young
1
啊,我明白了。使用Grunt,一切都通过任务来完成。您需要在Gruntfile.js中加载和配置grunt-contrib-jshint任务。唯一需要全局安装的是npm i grunt-cli -g,这样您就可以访问运行grunt命令以运行Gruntfile.js。有关更多信息,请参阅此指南:http://gruntjs.com/getting-started - Kyle Robinson Young
8
如果你本地保存了多余的库(不是全局安装的),你可以运行 npm prune 命令来删除它们。 - krx
2
@KyleRobinsonYoung: 在回答中提到这个怎么样?你可以使用 npm prune --your-env 命令移除所有未使用的包。 - geek_guy
显示剩余2条评论

22

1&2:这意味着您的项目的package.json文件中没有列出jshint,但是它是全局安装的。所以这不是一个大问题。

3:为了避免这个外来的错误,您可以使用选项--save运行或重新运行安装。这将自动更新您的package.json文件:

npm install -g jshint --save

或者需要手动更新您的package.json文件,添加一个"dependencies": {...}


在许多情况下,仅使用本地变量而不是全局变量可以避免重复。 - Bruno
3
"--save" 与 "-g" 不能同时使用。全局包列表中没有 package.json 文件。 - Guido Bouman

5
我通过在父级包文件夹中执行npm update来解决了这个问题,这将从列表中删除一些多余的包,然后对剩下的几个包执行npm uninstall <package>。看起来这样做有效,因为我完成后没有再出现错误。

3

我通过综合所有答案解决了这个问题。首先,我全局安装了该软件包。

npm install -g packagename --save

由于npm在全局安装了这个包,但没有将其添加到我的本地package.json文件中,因此我必须采取一些措施。

我选择的解决方案是删除本地的包,然后在全局安装它。

npm uninstall packagename
npm install -g packagename

这样做可以避免警告并且不会破坏package.json文件。

加100。我不得不在本地卸载并全局安装。 - Collin Peters

1
在我的情况下,在执行'npm ls'时,我在cygwin终端中看到了这个“npm ERR! extraneous”消息。我认为这是经过大量修补后的全局损坏设置的某种形式。我从这里学到了以下观察结果:
  • “npm ls”根据当前文件夹位置给出不同的输出。
  • “npm ls”试图检测当前文件夹位置中是否存在“node_modules”文件夹,并列出其中的内容。而不是全局的!
  • 此外,如果包含“node_modules”的当前文件夹还有一个包含较少模块的package.json文件,则会显示错误。

我通过“rm package.json”和“npm ls”不再显示错误消息。因此,我建议始终检查当前位置是否存在“node_modules”文件夹和package.json文件,因为这些首先进行检查,如果这些缺失,则继续检查父文件夹等等,如果您已经修补了许多代码片段,那么您可能会散布很多的node_modules文件夹和package.json文件。这里没有真正损坏,与我们进行J2EE Java开发/eclipse IDE或在使用regedit更改Windows设置的日子不同。


1
在我的情况下,是因为在依赖模块的package.json文件中列出的依赖名称与其package.json文件中的包名称不同。这是我的错误,因为这是我创建的新模块,但很难发现,因为npm不会给出任何提示。这种情况发生在使用dependencies: { "my-module": "file:local-modules/mymodule" }语法时,名称“my-module”拼写错误。

0

这是因为您的包不在package.json中。如果您将其添加进去,问题就会得到解决,请参考下面的图片:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接