【问题标题】:npm sets weird permisions for packages installed globallynpm 为全局安装的包设置奇怪的权限
【发布时间】:2016-11-19 05:11:24
【问题描述】:

我正准备在家里开始一些 node.js 开发,但在全局安装 npm 包时偶然发现了一些奇怪的行为。

我使用 WebStorm 作为我的 IDE,并且想要使用 ECMAScript6 功能,这意味着我必须转译源代码,而 WebStorm 使用 Babel 来完成。

所以我尝试全局安装 Babel:

$ sudo npm install -g babel-cli

发生的情况是,这些文件都可以从 root 用户正常访问,并且只要我看起来像 rootbabel-cli 目录以及其中的所有文件和目录看起来都很好。当我尝试以其他用户的身份查看或使用该软件包时,问题就出现了:

$ ls -l /usr/lib/node_modules/babel-cli/
ls: cannot access '/usr/lib/node_modules/babel-cli/lib': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/index.js': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/scripts': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/node_modules': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/package.json': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/README.md': Permission denied
ls: cannot access '/usr/lib/node_modules/babel-cli/bin': Permission denied
total 0
d????????? ? ? ? ?            ? bin/
d????????? ? ? ? ?            ? lib/
d????????? ? ? ? ?            ? node_modules/
d????????? ? ? ? ?            ? scripts/
-????????? ? ? ? ?            ? index.js
-????????? ? ? ? ?            ? package.json
-????????? ? ? ? ?            ? README.md

不管我安装哪个包,都会变成这样。

我在 Ubuntu 16.04 上使用 node.js v6.3.0 和 npm 3.10.3。

我按照here 的指示全新安装了 node.js。如果我尝试更新 npm,那么全局 npm 目录也会发生同样的情况,并且 npm 变得不可用,除了 root

当我将全局 node_modules 列为我看到的用户时

$ ll /usr/lib/node_modules/
total 8,0K
drwxr--r--  6 nobody root 4,0K jul 15 23:50 babel-cli/
drwxr-xr-x 10 root   root 4,0K jul 15 23:21 npm/

除了 nobody 拥有的目录之外,我没有发现任何特别之处。

我安装包的时候当然没有错误。

npm 和/或节点有问题吗? Ubuntu有什么问题吗?或者我如何安装节点?什么可能是某事的原因 会这样吗?

本地安装工作正常,对于babel-cli 包,将其安装为本地开发包是一种可接受的解决方法。我仍然想知道在全局安装软件包时会发生什么,以及为什么。


问题answered here。问题与npmnode 无关。

【问题讨论】:

  • 我使用节点源存储库,我还没有看到这些问题。但是,我使用较旧的 npm 运行节点 4.4。您是否只是为了 babel 而遇到他的问题? grunt、gulp、bower 等其他 CLI 工具呢?
  • @tsturzl 我全局安装的所有包都是一样的。
  • 永远不要将sudonpm 一起使用。你只是自找麻烦。清除节点、所有 npm 模块和目录,并以普通用户权限安装所有内容。

标签: node.js ubuntu npm installation


【解决方案1】:

如果要全局安装包,只需使用不带sudo 的命令即可:

$ npm install -g <package>

如果您遇到 EACCES 或权限错误,应避免使用 sudo,但您应改为修复您的权限,以便 npm 可以在没有 sudo 的情况下运行。

如果您无权写入 npm 用于存储全局包的文件夹,则会引发这些错误。要解决这个问题,您可以从查找 npm 的默认目录的路径开始:

$ npm config get prefix

在大多数系统上,它将是 /usr/local,您将能够修复此文件夹的权限。如果文件夹是/usr/usr/lib,你不应该改变这个目录的权限,因为它会导致一些问题,在这种情况下你不想改变默认目录的权限,你可以配置npm使用不同的目录。

如果您可以并且想要更改默认文件夹的权限,您可以使用:

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

它会将 npm 目录的所有者更改为当前用户的名称。

如果你想改变 npm 的默认目录,你可以从创建这个新文件夹开始:

$ mkdir ~/.npm-packages

然后,您将 npm 配置为使用这个新文件夹:

$ npm config set prefix '~/.npm-packages'

您还需要将此新文件夹添加到您的 PATH(例如使用 ~/.profile):

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

此时,您可以使用source ~/.profile 更新您的系统变量并测试以在不使用sudo 的情况下全局安装软件包。

由于 npm 将使用 ~/.npm-packages 文件夹,因此您应该能够安装软件包而不会出现任何权限错误。

您可以在npm documentation 上找到有关此问题的更多信息。

【讨论】:

  • 我投了反对票,因为在/usr 下给予系统目录的非特权用户所有权总是一个坏主意,这个答案似乎鼓励了这一点。如果您想全局安装模块(即安装到系统中,以便其他用户可以利用它们),您必须以root 用户身份或通过sudo 执行此操作。做任何其他事情都是不负责任的——在你自己的机器上是个问题,但是教开发人员这是正确的方法,然后他们去自己的服务器上做,那就是一场灾难。
  • 只有当npm的默认值直接为/usr/local时才建议修改权限,并且答案明确指出如果它在另一个目录中,则不应修改权限。另一方面,如果您认为修改/usr/local 的权限仍然是个坏主意,也许您应该open an issue immediately to npm,因为这是官方的、记录在案并推荐的修复权限的方法:docs.npmjs.com/getting-started/fixing-npm-permissions
  • 我对那个愚蠢的文档很熟悉,并且已经有一个关于它的错误:github.com/npm/docs/issues/745。 NPM 文档的所有者(至少)似乎同意。我只是希望她能尽快解决这个问题,正如她所承诺的那样。
【解决方案2】:

如果您更改用户,则必须执行以下操作之一,因为当您安装 npm 时,您是作为 Root 用户安装的,但在您更改用户之后,您会出现权限错误,因为这表明您没有有权写入 npm 用于存储全局包和命令的目录。您可以通过以下方式解决此问题:-

请使用包管理器为您处理此问题。

如果您在 Mac OS 上重新安装节点,则可以使用 Homebrew 包管理器完全避免此问题。 Homebrew 使用正确的权限设置开箱即用。

brew install node

将 npm 的默认目录更改为另一个目录

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

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

为全局安装创建一个目录:

mkdir ~/.npm-global

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

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

打开或创建一个 ~/.profile 文件并添加以下行:

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

回到命令行,更新你的系统变量:

source ~/.profile

测试:不使用 sudo 全局下载包。

npm install -g babel-cli

除了步骤 2-4,您还可以使用相应的 ENV 变量(例如,如果您不想修改 ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 2021-10-19
    • 2021-04-13
    • 1970-01-01
    • 2017-11-05
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多