即使目录可写,全局安装时也会出现 NPM 错误

Posted

技术标签:

【中文标题】即使目录可写,全局安装时也会出现 NPM 错误【英文标题】:NPM error when installing globally even when directories are writable 【发布时间】:2013-01-25 01:04:49 【问题描述】:

尝试使用此命令安装咖啡脚本时出现此错误:

npm install -g --verbose coffee-script opal

这些是错误信息:

npm ERR! Error: EACCES, symlink '../lib/node_modules/coffee-script/bin/coffee'
npm ERR!   [Error: EACCES, symlink '../lib/node_modules/coffee-script/bin/coffee']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '../lib/node_modules/coffee-script/bin/coffee' 
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm info postuninstall opal@0.3.2
npm ERR! Error: EACCES, symlink '../lib/node_modules/opal/bin/opal-node'
npm ERR!   [Error: EACCES, symlink '../lib/node_modules/opal/bin/opal-node']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '../lib/node_modules/opal/bin/opal-node' 
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

文件夹 /usr/local/bin 和 /usr/local/lib/node_modules 由当前用户拥有和可写,我不想使用 root 运行该 npm 命令,如何知道 npm 尝试了哪个文件夹建立一个符号链接?

我正在使用 npm 1.2.9-1chl1~quantal1 和 nodejs 0.8.19-1chl1~quantal1

【问题讨论】:

【参考方案1】:

您的节点安装使用系统目录。使用-g时使用sudo

sudo npm install -g --verbose coffee-script opal

【讨论】:

这样做有什么不安全的地方吗? 那样做我会觉得不舒服。我宁愿以不需要 sudo 的方式安装节点。 sudo npm remove -g name-of-module npm 的作者不鼓励 sudo npm,参见例如这里:***.com/a/29787931/1614973 @DmitriZaitsev 确实如此,但在 OP 案例中,这是让他摆脱困境的最简单方法。修复他的 npm 缓存的权限并不是一个单一的解决方案。【参考方案2】:

你可以chown NPM 的bin 到你的用户名用这一条线来解决这个问题:

$ chown -R `whoami` `npm -g bin`

【讨论】:

小心!更改 /usr/bin/ 中所有内容的所有权(例如,sudo 也)【参考方案3】:

啊,使用这个命令:

npm -g bin

它会输出如下内容:

/usr/bin # this is the folder nodejs wanted to write..

然后你可以chmodchown 以便可以编写安装。

【讨论】:

这是有用的信息,但不能回答问题。【参考方案4】:

我在NPM modules won't install globally without sudo 遇到了类似的问题,问题是当我安装节点时,我通过 chris/lea ppa repo 使用 sudo 完成了它

我的解决方案是卸载节点,然后以这种方式安装:

从 nodejs.org 下载最新的稳定节点源 #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #解压缩源

cd node-v0.10.20 #进入解压文件夹

sudo chown $USER -R /usr/local

./configure --prefix=/usr/local && make && make install

PD:如果您不想更改 /usr/local 文件夹的所有权,您可以将其安装在您已经拥有的位置。这种方法的问题是,您必须将安装文件夹与 bash 命令行绑定,以便我们稍后可以使用 node 命令

mkdir ~/opt

./configure --prefix=~/opt && make && make install

echo 'export PATH=~/opt/bin:$PATH' >> ~/.bashrc #or ~/.profile or ~/.bash_profile or ~/.zshenv 取决于当前的操作系统

使用其中任何一种方法,您都可以在不使用 sudo 的情况下执行以下操作

npm install -g --verbose coffee-script opal

【讨论】:

【参考方案5】:

遇到了类似的问题。原来我在用sudo 安装的project/node_modules 目录中有一些东西。在我的情况下,它是一些依赖项和 .bin 目录。我删除了这些坏目录,然后再次运行npm install,它成功了。我确实也重新安装了全局量角器和 phantomjs,但不确定是否需要。我确信这是错误的(即 root 拥有的).bin 目录造成的。

【讨论】:

您不必删除“坏”目录,只需按照其他答案中的说明设置它们的权限和/或所有权。

以上是关于即使目录可写,全局安装时也会出现 NPM 错误的主要内容,如果未能解决你的问题,请参考以下文章

即使 IAM 角色具有完整的 Redshift 权限,AWS Lambda 在调用 Redshift 的“CreateCluster”操作时也会出现“拒绝访问”错误

Spring Boot 2.0.3 Oauth2 安全性:即使在标头中使用访问令牌时也会出现 401 错误

JSLint:设置控制台时出现只读错误,即使它设置为可写全局

“交易已中止”即使在故意中止时也会被抓住

如何修复 npm 无法全局安装 typescript 错误

即使安装了 Microsoft Visual C++ 14.0 也会出现 Pip 错误