Почему в npm для глобальных пакетов по умолчанию установлен каталог с привилегиями root?

Почему в npm для глобальных пакетов по умолчанию установлен каталог с привилегиями root?

Я сейчас изучаю Angular и npm. Сегодня я попытался сделать это npm i -g @angular/cliна моей Fedora, но вместо того, чтобы установить его, я увидел в терминале (я сократил сообщение для удобства):

npm WARN checkPermissions Missing write access to /usr/lib/node_modules

Итак, я проверил в Google, что это значит. Я нашелэто объяснение npm, и эта статья привела меня кеще одна статья npmописывая эту ошибку более подробно. В последней статье говорилось, что:

Если при попытке глобальной установки пакета вы видите ошибку EACCES, вы можете:

Переустановите npm с помощью менеджера версий узлов (рекомендуется),

или

Вручную измените каталог npm по умолчанию

В качестве быстрого решения оба вышеприведенных решения показались мне приемлемыми.

Но поскольку у меня есть некоторый опыт работы с Linux, я начал задаваться вопросом: зачем мне устанавливать еще одно программное обеспечение или зачем мне вообще менять какую-то конфигурацию? Говоря иначе, почему конфигурация по умолчанию для npm и конфигурация по умолчанию для Fedora требуют, чтобы я настраивал хотя бы одну из них, чтобы не было никаких ошибок?

Задав себе эти вопросы, я подумал, что дело может быть в моей конфигурации npm. Скорее всего, я ничего не менял с момента установки, но кто знает? Поэтому я решил переустановить npm. Для уверенности я перезагрузил компьютер после удаления. После переустановки я попробовал npm i -g @angular/cliеще раз — но возникла та же ошибка.

Затем я подумал: может, дело не в npm, а в моей установке Fedora? Я определенно не хотел переустанавливать Fedora по такой причине. Поэтому я проверил в Google, являются ли разрешения Fedora по умолчанию для каталога /usr/lib/node_modulesтакими, какие они есть по умолчанию. Для моего каталога, как для /usr, /usr/libтак и /usr/lib/node_modules(и даже для /usr/lib/node_modules/npm) владелец и группа были root rootи только у владельца есть права на запись. Единственный источник, который я нашел, был "Руководство по установке Fedora 26" (хотя у меня установлена ​​Fedora 29), и этот документ советовал мне просмотретьСтандарт иерархии файловой системы 2.3для структуры каталогов. Поскольку я ожидал node_modulesназначить именно те разрешения, которые требуются npm, я проверил только /usrи /usr/lib. Для /usrкаталога FHS, похоже, ничего не сказал о разрешениях; для каталога /usr/libон сказал, что:

/usr/lib включает объектные файлы, библиотеки и внутренние двоичные файлы, которые не предназначены для непосредственного выполнения пользователями или сценариями оболочки. [22]

Эта информация также оказалась не очень полезной.

В конце концов, я пришел к выводу, что я все еще не понимаю, в чем истинная причина ошибки, которую я получил. Поэтому теперь я хотел бы спросить:

  1. Должен ли npm быть настроен по умолчанию таким образом, чтобы он помещал новые пакеты /usr/lib/node_modules?
  2. Если да, то установила ли Fedora какие-то другие разрешения по умолчанию, которые она должна/должна/может иметь для этих каталогов?
  3. Если нет, возможно ли, что я случайно изменил права доступа к этой папке для своей установки Fedora?
  4. Если нет, то это тот случай, когда я не устанавливаю пакеты npm с правами root? Это тоже похоже на исправление, но в документации npm такое решение не упоминается.
  5. Если нет, то это тот случай, когда я пытаюсь установить пакеты npm глобально, хотя мне этого делать не следует? Если да, то почему такая возможность существует?
  6. Может я чего-то не понимаю или упускаю? Может у меня нет какой-то (актуальной) документации?

ОБНОВЛЯТЬ:Я забыл указать, что я запускаю все команды как обычный пользователь, а не как root.

решение1

Вы не сказали, под каким пользователем вы это запустили, но я предполагаю, что это был не root? В этом случае ошибка верна, но также ожидаема, поскольку обычные пользователи не должны иметь возможности устанавливать в системные каталоги.

В любом случае вам никогда не следует использовать npmдля глобальной установки пакетов пакет Node.js в Fedora, хотя бы потому, что это оставит вас с запутанной мешаниной из управляемых rpm и управляемых npm модулей в /usr/lib/node_modules.

К сожалению, в отличие от других языковых сред, Node.js не поддерживает наличие двух отдельных глобальных каталогов модулей (один /usrдля модулей, управляемых системной упаковкой, и один /usr/localдля модулей, управляемых собственными инструментами языковой среды), поэтому мы не можем сделать это разумным способом без обширного исправления npm, которое мы не хотим делать. Даже если бы такое разделение было возможно, вам все равно нужно было бы быть пользователем root для выполнения глобальной установки, как вы это делаете с perl, python или ruby.

Насколько я понимаю, глобальная установка в Node.js в любом случае не приветствуется — позиция разработчиков заключается в том, что локально в каждом проекте следует устанавливать только те модули, которые необходимы проекту.

Связанный контент