在OSX中安装npm模块时出现权限被拒绝的问题

139

我正在尝试安装node-g.raphael,但是我遇到了以下错误:

Bender-03:htdocs alfred$ sudo npm install node-g.raphael --save
Password:

> contextify@0.1.15 install 
  /Users/alfred/Sites/twistedgeo/htdocs/node_modules/contextify
> node-gyp rebuild

gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir 
  '/Users/alfred/Sites/twistedgeo/htdocs/node_modules/contextify/build'
gyp ERR! System Darwin 16.7.0
gyp ERR! command "/usr/local/bin/node" 
  "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" 
  "rebuild"
gyp ERR! cwd 
  /Users/alfred/Sites/twistedgeo/htdocs/node_modules/contextify
gyp ERR! node -v v8.8.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: contextify@0.1.15 
  (node_modules/contextify):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: contextify@0.1.15 
  install: `node-gyp rebuild`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1

+ node-g.raphael@0.0.9
added 2 packages and updated 1 package in 6.556s

我尝试了这个解决方案,但它并没有解决我的问题,仍然收到相同的错误信息。

如果有什么可以帮助解决问题的,请让我知道。

6个回答

437

我从解决npm权限问题中看到了这个方法,它对我很有帮助,您也可以试一试。

选项1:更改npm默认目录的权限

  1. 查找npm目录的路径:

    npm config get prefix

对于许多系统来说,这将是/usr/local

警告:如果显示的路径只是/usr,请切换到选项2,否则您的权限将会出问题。

  1. 将npm的目录所有者更改为当前用户的名称(即您的用户名):

    sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

这将更改npm和其他一些工具使用的子文件夹的权限(lib/node_modulesbinshare)。

选项2:更改npm的默认目录为另一个目录

有时您不想更改npm使用的默认目录(即/usr),因为这可能会引起一些问题,例如如果您要与其他用户共享系统。

相反,您可以将npm配置为使用完全不同的目录。在我们的情况下,这将是我们主文件夹中的一个隐藏目录。

  1. 创建用于全局安装的目录:

    mkdir ~/.npm-global

  2. 配置npm以使用新的目录路径:

    npm config set prefix '~/.npm-global'

  3. 打开或创建~/.profile文件,并添加此行:

    export PATH=~/.npm-global/bin:$PATH

  4. 回到命令行界面,更新您的系统变量:

    source ~/.profile

测试:全局下载一个包而不使用sudo

`npm install node-g.raphael --save`

如果您不想修改~/.profile,可以使用相应的ENV变量代替2-4步骤:

NPM_CONFIG_PREFIX=~/.npm-global

选项3:使用一个可以为您处理这些问题的软件包管理器。

如果你在 Mac OS 上进行 Node 的全新安装,你可以通过使用 Homebrew 软件包管理器来完全避免这个问题。 Homebrew 会在安装时提供正确的权限设置。

brew install node


2
这个答案帮了我很大的忙。感谢您提供精心制作且易于理解的答案。需要注意的是,如果您使用Fish shell并选择选项1,则需要在命令中删除$,使其读作:sudo chown -R (whoami) (npm config get prefix)/{lib/node_modules,bin,share} 再次感谢您提供如此好的答案! - Chucky
2
我尝试执行“OPTION 2”步骤。在MacOS Catalina v10上,默认的shell是ZSH,它使用/.zprofile而不是/.profile。这就是为什么上面的配置一开始在终端上无法工作,但当使用BASH shell时它可以工作的原因。 您可以在此处找到详细说明: https://superuser.com/a/187673 - Nuryagdy Mustapayev
如何放弃这些更改?哈哈 - JORGE GARNICA
@antzshrek 我的意思是,我现在卡住了,试图还原所有更改以保持默认目录和与节点和.nvm相关的一切。 - JORGE GARNICA
1
我试图在 macOS Montery 上安装 node 和 nvm,但是当我尝试安装一个包(npm install -g ...)时,一直出现“EACCES”错误。选项一为我解决了权限问题。 - ckoerner
显示剩余11条评论

9
我使用:
  1. npm config get prefix
  2. sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  3. sudo npm install
(注:这是一段代码,无法直接翻译成中文)

2

0
Brew uninstall node 
Brew install node 

如果有错误,请创建一个链接,如果链接无效,请执行以下操作 只需运行这四个命令:

  sudo chown -R `whoami`:admin /usr/local/include/node
    sudo chown -R `whoami`:admin /usr/local/bin
    sudo chown -R `whoami`:admin /usr/local/share
    sudo chown -R `whoami`:admin /usr/local/lib/dtrace 

最后,运行覆盖命令:

brew link --overwrite node


-7

要在Mac/Linux上获取访问权限,只需使用此命令

sudo npm install -g {package_name}

然后你就可以开始了。


如果您想在Mac或Linux中全局安装任何依赖项,您必须使用sudo或手动在设置中为所有软件包配置。 - Pankaj Garg
1
你不需要使用 sudo 来全局安装软件包,也不应该这样做。 - Amir Shabani

-15

我通过运行以下命令解决了我的问题。

sudo npm install -g @angular/cli

现在我可以安装 Angular 了。

然后尝试运行 ng -v 来确认。


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