当我们在普通用户组条件下使用命令npm install -g package_name时候,可能会碰到如下错误提示:1
2
3
4
5
6
7
8
9
10$ npm install -g npm
Error: EACCES: permission denied, access '/**/**/**/node_modules/npm/node_modules/cmd-shim/node_modules/graceful-fs'
npm ERR! at Error (native)
npm ERR! { [Error: EACCES: permission denied, access '/**/**/**/node_modules/npm/node_modules/cmd-shim/node_modules/graceful-fs']
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'access',
npm ERR! path: '/**/**/**/node_modules/npm/node_modules/cmd-shim/node_modules/graceful-fs' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
这是因为普通用户对于npm默认使用的文件夹不具有足够的权限。
根据官方文档说明
有两种解决办法:
- 修改默认全局npm包安装位置内文件夹的权限
- 使用另外一个文件夹作为全局npm包安装位置
方案一
步骤1 察看对全局npm包安装位置的设定
1 | $ npm config get prefix |
特别注意:官方文档明确指出,如果npm config get prefix命令返回值为/usr,则必须使用第二种方案
步骤二 更改必要目录的权限
1 | $ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} |
这条命令目的是将全局安装npm包的路径下的lib/node_modules,/lib/bin,lib/share目录的拥有者设置为当前普通用户。因为这些目录的拥有着本身就具有对这些目录的读写权限,所以问题得以解决(此方案我执行过多次,没有碰到问题)
然后再次运行之前运行不通过的命令,现在可以顺利通过了
方案二
步骤一 在合适位置创建一个文件夹
1 | $ mkdir ~/.npm-global |
步骤二 使用之前创建的文件夹作为全局npm包安装的位置
1 | $ npm config set prefix '~/.npm-global' |
步骤三 将新设定的路径加入环境变量
1 | $ export PATH=~/.npm-global/bin:$PATH |
将我们设定的全局npm包安装位置下的bin目录加入到系统环境变量,这样我们才可以在任意命令行位置都能执行全局npm包提供的命令
步骤四 让系统重新载入环境变量
1 | $ source ~/.profile |
完成之后,再次运行之前运行不通过的命令,现在可以顺利通过了