NPM/Cordova 权限错误: EACCES: 权限被拒绝, scandir

5
当我运行cordova plugin add cordova-plugin-geolocation时,我收到以下错误。我尝试过在此文件夹上启用777,将自己设置为所有者等。在这种情况下,我不允许使用sudo,但如果我可以使用它,我相信问题会得到解决。
Failed to install 'cordova-plugin-geolocation': Error: EACCES: permission denied, scandir '/Users/username/documents/core/myapp/app/platforms/ios/build/device/libCordova.a'
    at Error (native)
    at Object.fs.readdirSync (fs.js:952:18)
    at GlobSync._readdir (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:275:41)
    at GlobSync._readdirInGlobStar (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:254:20)
    at GlobSync._readdir (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:263:17)
    at GlobSync._processReaddir (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:135:22)
    at GlobSync._process (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:130:10)
    at GlobSync._processGlobStar (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:360:10)
    at GlobSync._process (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:128:10)
    at GlobSync._processGlobStar (/Users/username/documents/core/myapp/app/platforms/ios/cordova/node_modules/glob/sync.js:363:10)
Error: EACCES: permission denied, scandir '/Users/username/documents/core/myapp/app/platforms/ios/build/device/libCordova.a'

1
首先,您需要告诉我们您使用的 Cordova 和插件版本。此外,这只是针对特定插件添加还是全部都出现了这个问题? - Gandhi
@Gandhi,我解决了。我所要做的就是重新安装 Cordova 而不使用 sudo。 - jskidd3
@Gandhi 我提到了这是一个权限错误,一般来说这将排除 Cordova 版本或特定插件的相关性。 - jskidd3
既然你特别提到了地理位置插件,我认为这可能是插件特定的。 - Gandhi
@Ghandi 公平的观点,我只是举了个例子,但应该表述更清楚。一旦悬赏到期,我将删除问题。无论如何,谢谢。 - jskidd3
谢谢提供信息,祝好。我之前以为这可能是访问相关的问题,但对于一个悬赏问题来说,这个解决方案可能不是那么直接了当。 - Gandhi
3个回答

11

NPM问题

您可以通过以下三种方式之一来解决此问题:

  1).Change the permission to npm's default directory.
  2).Change npm's default directory to another directory.
  3).Install node with a package manager that takes care of this for you.

在继续操作之前,您应该备份您的计算机。

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

1).找到npm目录的路径:

    npm config get prefix

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

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

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

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

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

选项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 -g jshint

你可以使用相应的环境变量代替步骤 2-4(例如,如果您不想修改 ~/.profile 文件):
  NPM_CONFIG_PREFIX=~/.npm-global

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

如果您在Mac OS上进行全新安装节点,您可以通过使用Homebrew包管理器来完全避免这个问题。Homebrew会在开箱即用时设置正确的权限。

  brew install node

我感谢您详细的回答,但是我通过简单地卸载 Cordova,然后重新安装它而不使用 sudo 来解决了这个问题。 - jskidd3
听到你这么说真是太好了,我们需要一个解决方案,就是这样。继续吧。 - Kondal

1

对于Mac用户,如果您正在寻找快速答案,您可以编辑位于/Users/$(whoami)/.npm.npm文件夹的权限。

  1. 转到.npm父文件夹(以防止在错误位置运行第二个命令)。
$ cd /Users/$(whoami)

2. 运行 chmod 命令更改 .npm 文件夹的权限。
$ sudo chmod -R 777 .npm/*

这就是我在我的案例中解决问题的方法。


1
谢谢。我在OSX终端中使用Cordova应用程序时遇到了类似的EACCES错误,使用这个变化后的命令解决了我的问题:sudo chmod -R 777 /Users/MyUsername/Documents/Projects/MyApp/* - Christopher

0

如果有人遇到了sudo自我毁灭的Mac cordova环境,这是我的唯一解决方案(经过了很多痛苦):

  • 备份所有文件
  • 删除所有cordova平台(警告:这将破坏您在平台内所做的任何自定义内容,因此需要备份)
  • 全局卸载cordova
  • 卸载npm;我只使用了他们网站上的基本命令:sudo npm uninstall npm -g
  • 安装NVM
  • 通过NVM安装Node长期稳定版
  • 安装cordova(不再需要sudo)
  • 获取您项目目录的权限(我递归地对整个用户目录进行了操作)
  • 添加您的平台
  • 将您的自定义内容重新应用到项目中
  • 找一把舒适的椅子,喝一杯威士忌

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