Почему в 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]
Эта информация также была не очень полезной.
В конце концов, я пришел к выводу, что до сих пор не понимаю, в чем истинная причина ошибки, которую я получил. Итак, теперь я хотел бы спросить:
- Это то, что npm должен быть настроен по умолчанию так, как он должен поместить новые пакеты в
/usr/lib/node_modules
? - Если да, то означает ли это, что Fedora установила некоторые другие разрешения по умолчанию, которые она должна / должна / может иметь для этих каталогов?
- Если нет, возможно, я случайно изменил разрешения для своей установки Fedora для этих каталогов?
- Если нет, то я не устанавливал пакеты npm с правами root? Похоже, это тоже исправление, но в документации по npm такое решение не упоминается.
- Если нет, то я пытаюсь установить пакеты npm глобально, а мне не следует? Если так, то почему такая возможность?
- Есть что-то, чего я не понимаю или мне не хватает? Может быть, мне не хватает какой-либо (актуальной) документации?
ОБНОВЛЕНИЕ: я забыл указать, что я запускаю все команды как обычный пользователь, а не как root.
1 ответ
Вы не сказали, от какого пользователя вы его запускаете, но я предполагаю, что это не root? В этом случае ошибка верна, но также ожидаема, потому что обычные пользователи не должны иметь возможность устанавливать в системные каталоги.
В любом, вы никогда не должны использовать npm
устанавливать пакеты глобально с помощью упакованного в Fedora Node.js хотя бы потому, что это оставит вас в замешательстве из-за неразберихи с управляемыми модулями rpm и npm в /usr/lib/node_modules
,
К сожалению, в отличие от других языковых сред, Node.js не поддерживает наличие двух отдельных глобальных каталогов модулей (один в /usr
для модулей, управляемых системой упаковки и одного в /usr/local
для модулей, управляемых собственным инструментарием языковой среды), поэтому мы не можем разумно выполнить эту работу без обширного исправления npm, которое мы не хотим делать. Даже если бы такое разделение было возможно, вам все равно нужно было бы иметь права root для глобальной установки, точно так же, как вы делаете это с perl, python или ruby.
Насколько я понимаю, глобальная установка в любом случае не приветствуется Node.js - точка зрения апстрима заключается в том, что вы должны устанавливать локально в каждом проекте только те модули, которые нужны проекту.