本地安装和全局安装NPM模块的区别

42
在我的`package.json`文件中,我列出了bower作为依赖项。在我运行`npm install`之后,bower会被本地安装。当我尝试在本地安装后运行bower时,会出现错误:

"bower"不被识别为内部或外部命令

似乎唯一解决这个问题的方法是全局安装bower。为什么我必须这样做?如果我的项目包含一个本地副本的bower,为什么node不能使用它?
4个回答

50

本地安装可以使得 bower 可在当前项目中使用(它将所有的 node 模块存储在 node_modules 中)。这通常只适用于像下面这样使用模块: var module = require('module'); 直到你全局安装了它 npm install -g module,shell 才能解析该命令。npm 会将其安装在一个路径变量可以解析该命令的位置。

编辑:这篇文档 解释得相当详细。


3
使用类似 var bower = require('bower'); 这样的本地 bower 有什么意义? - Rigil
3
好的,bower不是一个好的例子,因为我认为他们没有通过JavaScript公开API,但是express是我在一个项目中使用过的东西,它具有命令行界面以及你在本地JS文件中使用的库。(请查看我编辑过的有用文档)。 - Jimi
2
它也很有用,因为在package.json中的scripts块中的命令会自动解析本地命令。这意味着您可以拥有一个依赖于bower的脚本,而不必在bower上有未记录的依赖项。 - loganfsmyth

23

您可以在命令提示符中键入以下行来执行本地实例:

node_modules/bower/bin/bower <bower args>

14
更简洁地说:node_modules/.bin/bower 的意思是指“bower”命令在项目中的路径。 - alans

3
我们同时使用 PHP 和 JavaScript,因此我们有 composer 和 npm。
我们所涉及的每个项目都有不同的包,用于包运行时以及构建/开发工具。
由于每个项目中存在版本限制,全局安装包的 x 版本 (可通过命令行运行) 将会导致问题,我们在每个包中安装所有工具。这样在相应的 composer.json / package.json 文件中定义就更容易了。
但是,如果您需要不断添加附加路径来运行 CLI 工具,则可能很麻烦。
为此,我们向团队推荐在适当的 .bashrc(或等效文件)中将以下路径添加到您的 $PATH 中: ./vendor/bin:./node_modules/.bin (编辑:对于 Windows,路径将会是 .\vendor\bin;.\node_modules\.bin;
因此,在项目 X 中,我们可以访问该项目的 CLI 工具。切换到项目 Y ,我们便能获取那个项目的工具。
当然,您可能会得到重复的工具,但由于每个项目都由不同的团队维护 (某些人属于多个团队),因此在全局设置中只有一个版本会成为问题。

2
通常情况下,如果你想在命令行中运行NPM模块,你需要将其全局安装以便被包含在你的路径中。由于它是本地安装的,因此你必须从node_modules文件夹中运行它。

1
正如被接受的答案中所链接的那样,这并不像安装所有内容全局化那样直截了当,也不是推荐的方式。 - PhilT

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