npm install -g package_name 权限问题应对方案

当我们在普通用户组条件下使用命令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默认使用的文件夹不具有足够的权限。
根据官方文档说明
有两种解决办法:

  1. 修改默认全局npm包安装位置内文件夹的权限
  2. 使用另外一个文件夹作为全局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

完成之后,再次运行之前运行不通过的命令,现在可以顺利通过了