npm install和sudo npm install -g的区别

17

对于某些包,我需要运行sudo npm install -g,而对于其他包,npm install就足够了。

为什么会有这种差异?有什么区别呢?

例如:

npm install -g grunt-cli  # doesn't work
sudo npm install -g grunt-cli  # works
npm install websocket-stream # works

sudo命令只有在使用-g标志时才是必需的吗?

5个回答

17

npm 本地安装包,即在当前文件夹内的 node_modules 文件夹中。这允许您的应用程序依赖于特定的软件包版本,而无需在系统上全局安装的软件包列表中进行配置。请参见 Isaac's 博客文章 的第一段(同时处理多个版本的相同内容),其中很好地解释了 npm 如何避免在其他编程生态系统中经常遇到的依赖关系问题。

另一方面,有些包旨在用作命令行实用程序,例如 grunt-climochajson。为了在任何地方使用它们,您需要全局安装它们,因此需要使用 -g 参数。

请注意,您不应该需要使用 sudo 安装全局包,请参见相关答案获取更多信息。


在Ubuntu上,如果当前目录中没有package.json文件,则运行npm install somemodule将会在~/.npm中安装somemodule而不是./node_modules。 - smertrios
@Paul Mougel 好的,我们不应该使用sudo安装全局包,这样就不应该会抛出错误了... - alexserver

2

看起来是权限问题。-g 全局安装它(你需要 'root'),但不建议以 root 身份安装。 在终端中运行:

sudo chown -R `whoami` ~/.npm

0

npm install -g grunt-cli 在全局模式下安装包,每个用户都可以使用它。 没有 -g,你只是在当前目录中安装它。 如果你不是 root 用户,你需要使用 sudo 来使用 -g。 如果你使用 npm 没有 -g 并且你对当前目录有写权限, 那么 sudo 是不必要的。否则,你仍然需要它。


0

-g 是全局的,不加只会在本地安装包。

你需要使用sudo来运行它,因为它会安装到默认用户可能没有访问权限的文件夹中。


0

grunt-cli 会提供一个可执行文件,该文件将被放置在您的 PATH 中,因此根据您配置系统的方式,它将需要 root 访问权限。
请参阅 npm 创建者的这篇文章,特别是有关使用 sudo 和 npm 的部分。

websocket-stream 是一个库,您的代码将使用它,因此执行某些任务将更容易,通常它将安装在项目的根目录下,即 node_modules 文件夹中。


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