为什么我必须以pipe理员的身份致电npm链接?

我通过全局安装了一些nodejs包

sudo npm install gulp -g 

现在我(或同一台机器上的另一个开发人员)想要在一个项目中使用它

 me@host:/my/project$ npm link gulp 

它失败了

 unbuild gulp@3.8.11 npm ERR! Error: EPERM, chmod '/my/projectnode_modules/gulp/bin/gulp.js' npm ERR! { [Error: EPERM, chmod '/my/projectnode_modules/gulp/bin/gulp.js'] npm ERR! errno: 50, npm ERR! code: 'EPERM', npm ERR! path: '/my/projectnode_modules/gulp/bin/gulp.js' } npm ERR! npm ERR! Please try running this command again as root/Administrator. npm ERR! System Linux 3.2.0-4-amd64 npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "link" "gulp" npm ERR! cwd /raid5/workspaces/jgr/aktivglueck-laravel npm ERR! node -v v0.10.29 npm ERR! npm -v 1.4.21 npm ERR! path /my/projectnode_modules/gulp/bin/gulp.js npm ERR! code EPERM npm ERR! errno 50 npm ERR! stack Error: EPERM, chmod '/my/projectnode_modules/gulp/bin/gulp.js' npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /my/projectnpm-debug.log npm ERR! not ok code 0 

 sudo npm link gulp 

一切正常。

我想知道的是: 为什么npm link需要pipe理员权限? 在我的理解,我在我的项目文件夹中创build一个链接,我有全权限 – 那么它在全球系统上做什么?

我相信npm link创build一个符号连接到当前目录,无论你的全局安装的节点包在哪里。 看到这里 。

如果你没有这个path的写权限(你可以用npm config get prefix来查看),你会看到你在那里看到的错误。

为避免必须sudo全局安装/链接,可以更改该目录的所有权/权限。