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 для текущего пользователя:

  1. Создайте каталог для глобальных установок:

    mkdir ~/.npm-global

  2. Настройте npm для использования нового пути к каталогу:

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

  3. Откройте или создайте файл ~/.profile и добавьте эту строку:

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

  4. Вернитесь в командной строке, обновите системные переменные:

    source ~/.profile

  5. Тест. Загрузите пакет по всему миру без использования sudo.

    npm install -g <package_name>

Вместо шагов 1-5 вы можете использовать соответствующую переменную ENV (например, если вы не хотите изменять ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global

Вышеприведенная конфигурация не будет работать, если вы используете sudo для установки модулей npm, поскольку она будет соответствовать настройкам, установленным для пользователя root.

Ответ 3

Вы должны соблюдать порядок загрузки.

Загрузка из папки node_modules

Если идентификатор модуля, переданный 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