Npm глобально не используется?
Таким образом, у меня раньше были некоторые проблемы с npm, и последовали некоторые команды stackoverflow/github, чтобы попытаться их исправить. Что сработало... Kinda. Все было хорошо до недавнего времени, когда я понял, что мои глобальные пакеты npm на самом деле не читаются/не используются.
Поэтому всякий раз, когда я делал npm -g, устанавливал xxx или обновление. Он обновляет глобальную папку в порядке, но ее просто не используют. Поэтому я пошел копать немного и нашел это.
Где npm читает/использует от
usr/local/lib/node_modules
Где глобальная установка
Users/Me/.npm-global/lib/node_modules
Поэтому всякий раз, когда я делал проверку -g для моих модулей и прочее, все хорошо и обновлялось, но когда я на самом деле пытаюсь запустить что-либо, команда npm использует ту, что в старых папках. Поэтому в основном я не могу ничего обновлять и устанавливать с помощью -g. И ничто не попадает в старую папку, которая фактически используется.
Как это разрешить? Была ли какая-то ссылка или профиль накручен?
Ответы
Ответ 1
Похоже, это касается вашей конфигурации префикса npm. Глобальный префикс - это папка, в которой npm будет устанавливать глобальные пакеты.
Сначала я запустил следующую команду, чтобы получить значение глобального префикса (https://docs.npmjs.com/cli/prefix)
$ npm prefix -g
Чтобы установить его на другое значение:
npm config set prefix /usr/local/lib/node_modules
Это касается расположения ваших глобальных пакетов, теперь вам нужно проверить, что ваша переменная PATH терминала проверяет эту папку на двоичные файлы.
$ echo $PATH
Команда выше будет печатать список разделяемых разделов ":", в котором ваша оболочка проверяет двоичные файлы.
Ваше глобальное расположение префикса npm должно быть частью этого списка, из вашего вопроса я бы предположил, что эта папка /usr/local/lib/node_modules уже есть.
Ответ 2
Ниже приведены шаги по изменению домашнего каталога для глобальных установок npm для текущего пользователя:
-
Создайте каталог для глобальных установок:
mkdir ~/.npm-global
-
Настройте npm для использования нового пути к каталогу:
npm config set prefix '~/.npm-global'
-
Откройте или создайте файл ~/.profile и добавьте эту строку:
export PATH=~/.npm-global/bin:$PATH
-
Вернитесь в командной строке, обновите системные переменные:
source ~/.profile
-
Тест. Загрузите пакет по всему миру без использования sudo.
npm install -g <package_name>
Вместо шагов 1-5 вы можете использовать соответствующую переменную ENV (например, если вы не хотите изменять ~/.profile):
NPM_CONFIG_PREFIX=~/.npm-global
Вышеприведенная конфигурация не будет работать, если вы используете sudo для установки модулей npm, поскольку она будет соответствовать настройкам, установленным для пользователя root.
Ответ 3
Вы должны соблюдать порядок загрузки.
Если идентификатор модуля, переданный require()
, не является основным модулем и не начинается с '/'
, '../'
или './'
, то Node.js начинается в родительском каталоге текущего модуля, и добавляет /node_modules
, и пытается загрузить модуль из этого места. Узел не добавит node_modules
к пути, который уже заканчивается в node_modules
.
Если он там не найден, он перемещается в родительский каталог и так далее, пока не будет достигнут корень файловой системы.
Например, если файл в '/home/ry/projects/foo.js'
вызвал require('bar.js')
, то Node.js будет выглядеть в следующих местах в следующем порядке:
-
/home/ry/projects/node_modules/bar.js
-
/home/ry/node_modules/bar.js
-
/home/node_modules/bar.js
-
/node_modules/bar.js
Это позволяет программам локализовать свои зависимости, чтобы они не сталкивались.
Возможно, потребуются определенные файлы или вспомогательные модули, распространяемые вместе с модулем, включая суффикс пути после имени модуля. Например, require('example-module/path/to/file')
разрешит path/to/file
относительно того, где находится example-module
. Суффиксный путь следует той же семантике разрешения модуля.
Ответ 4
Только незначительное изменение в ответе maxletou, вы пытались установить префикс следующим образом?
npm config set prefix /usr/local