2013-11-28 239 views
4

对于一些软件包,我必须运行sudo npm install -g,而对于其他的npm install就足够了。npm install vs sudo npm install -g

为什么和有什么区别?

例如:

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

是必要的sudo只与-g标志?

回答

10

npm在本地安装软件包,在当前文件夹内的node_modules文件夹中。这使您的应用程序可以依赖于特定的软件包版本,而不必搞乱系统上已安装软件包的全局列表。参见Isaac's blog post的第一段(同时处理同一事物的多个版本),这很好地解释了npm如何避免在其他编程生态系统中经常遇到的依赖性地狱。

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

请注意,您不应该需要sudo来安装全局软件包,请参阅this relevant answer了解更多信息。

+0

在Ubuntu上,如果在没有任何的package.json文件当前目录,运行npm install somemodule会将sommodule安装到〜/ .npm中,而不是in。/ node_modules – smertrios

+0

@Paul Mougel好吧,我们不应该用sudo安装全局包,所以它不应该抛出错误,然后... – alexserver

0

npm install -g grunt-cli以全局模式安装软件包,每个用户都可以使用它。 如果没有-g,您只需将其安装在当前目录中即可。 如果您不是root用户,则需要使用sudo作为-g。 如果您使用npm而没有-g并且您有写入权限到当前目录,则不需要 sudo。否则,你仍然需要它。

1

-g是全球性的,不需要在本地安装软件包。

您可以使用sudo运行它,因为它会安装到默认用户默认无法访问的文件夹中。

0

grunt-cli将提供一个可执行文件,将放入您的PATH,因此根据您配置系统的方式,它将需要root访问权限。
请参阅this post from npm creator,特别是关于使用sudo和npm的部分。

websocket-stream是一个库,你的代码会使用它,所以它会更容易执行一些任务,通常它会安装在你的项目的根目录下,在node_modules文件夹中。

0

看起来像权限问题。 -g安装全局(你将需要“根”),但它不是一个好主意,安装为根 在终端运行:

sudo chown -R `whoami` ~/.npm