Я пытаюсь установить глобально, а затем использовать forever
и forever-monitor
вот так:
npm install -g forever forever-monitor
Я вижу обычный вывод, а также операции, которые копируют файлы в глобальный путь, но затем, если я пытаюсь это сделать, require("forever");
я получаю сообщение об ошибке, говорящее о том, что модуль не найден.
Я использую последнюю версию как узла, так и npm, и я уже знаю об изменениях, внесенных npm в глобальную или локальную установку, но я действительно не хочу устанавливать localy в каждом проекте, и я работаю на платформе, которая не не поддерживает, link
поэтому npm link
после глобальной установки я не могу.
Мой вопрос: почему я не могу требовать глобально установленного пакета? Это особенность или ошибка? Или я что-то не так делаю?
PS: Просто чтобы сделать это кристально ясным: я не хочу устанавливать локально.
~/.config/yarn/global
для пряжиОтветы:
В Node.js require не смотрит в папку, где установлены глобальные модули.
Вы можете исправить это, установив переменную окружения NODE_PATH. В Linux это будет:
Примечание. Это зависит от того, где на самом деле установлены ваши глобальные модули.
Смотрите: Загрузка из глобальных папок .
источник
export NODE_PATH=/usr/local/lib/node_modules
вместо этого.NODE_PATH
переменной средыC:\Users\{USERNAME}\AppData\Roaming\npm\node_modules
.%AppData%\npm\node_modules
будет работать на Windows 10.NODE_PATH
могу ли я использовать глобальные и локальные модули одновременно?NODE_PATH=$(npm root -g)
После того, как вы установили пакет глобально, вы должны связать локальный проект с глобальным пакетом
Смотри здесь
источник
~/some-stand-alone-random-nodejs-test.js
. Я не хочу превращать мою домашнюю папку в каталог проекта. Я не хочу создавать новые папки для каждого небольшого эксперимента.npm link <module>
Затем вы увидите ярлык (ссылку), созданный в папке node_module ваших проектов со ссылкой на модуль глобального узла.Извиняюсь за некромантию, но я могу указать жестко запрограммированные пути к глобально установленным модулям:
Это не идеально, но, учитывая, что Unity3d пытается «скомпилировать» весь javascript, который включен в каталог проекта, я действительно не могу установить какие-либо пакеты.
источник
Я знаю , что это старый вопрос, но я столкнулся с этим , когда пытаюсь сделать некоторые проверки версий , используя
semver
вpreinstall
сценарии вpackage.json
. Так как я знал, что не могу зависеть от каких-либо локальных установленных модулей, я использовал это для запросаsemver
из глобальнойnode_modules
папки (вnpm
зависимости от этого я знаю, что она есть):Мне нравится этот подход, потому что он не требует установки каких-либо специальных модулей для использования.
Я не использовал такое
NODE_PATH
решение, как предлагали другие, поскольку хотел, чтобы это работало на чьей-либо машине, без необходимости дополнительной настройки / настройки перед запускомnpm install
моего проекта.Как это закодировано, гарантированно найти только модули верхнего уровня (установленные с использованием
npm install -g ...
) или модули, необходимые дляnpm
(перечисленыdependencies
здесь: https://github.com/npm/npm/blob/master/package.json ). Если вы используете более новую версию NPM, он может найти зависимости от других глобально установленных пакетов, поскольку теперь существует более плоская структураnode_modules
папок.Надеюсь, это кому-нибудь пригодится.
источник
Согласно документации , Node.js будет искать в следующих местах по умолчанию:
Путь, указанный в
NODE_PATH
переменной среды .Примечание:
NODE_PATH
переменная окружения установлена в список абсолютных путей, разделенных двоеточиями.Текущая
node_modules
папка. (местный)$HOME/.node_modules
(Глобальный)Примечание:
$HOME
это домашний каталог пользователя.$HOME/.node_libraries
(Глобальный)$PREFIX/lib/node
(Глобальный)Примечание:
$PREFIX
в Node.js, настроенныеnode_prefix
.Чтобы проверить текущее значение
node_prefix
, запустите:Примечание. Префикс соответствует
--prefix
параметру во время сборки и относится кprocess.execPath
. Не путать со значением изnpm config get prefix
команды. источникЕсли данный модуль не может быть найден, это означает, что он не присутствует ни в одном из указанных выше мест.
Расположение глобальной корневой папки, в которой установлены модули, можно распечатать:
npm root -g
(по умолчанию путь вычисляется во время выполнения, если он не переопределен вnpmrc
файле ).Решение
Вы можете попробовать следующие обходные пути:
Укажите местоположение вашего глобального модуля в
NODE_PATH
переменной среды. НапримерЧтобы проверить и распечатать значение
NODE_PATH
, выполните:Для более постоянного решения, свяжите вашу
$HOME/.node_modules
глобальную пользовательскую папку, чтобы указать на корневую папку, выполнив эту команду:Затем повторно протестируйте его с помощью
echo 'require("forever")' | node
команды :.Временно измените текущую папку на то место, где расширение было установлено глобально, прежде чем запускать скрипт. Например
Настройте глобальное назначение установки в
npm
файле userconfig (см . :)npm help 5 npmrc
или с помощьюuserconfig
param (--prefix
).Для отображения текущей конфигурации, выполните команду:
npm config list
.Для редактирования текущей конфигурации, выполните команду:
npm config edit
.Укажите полный путь расположения узловых модулей при вызове
require()
. НапримерУстановите пакет в другое место, например
Тем не менее, установка будет прервана
~/.node_modules/lib/node_modules/
, поэтому местоположение еще нужно добавить.Смотрите: локальный установочный пакет npm в произвольном месте
Создайте символическую ссылку в текущей папке из расположения глобального пакета. Например
источник
Вы можете использовать пакет
requireg
для решения этой проблемы:сделает свое дело.
Кроме того, есть еще один модуль,
global-npm
хотя он специфичен только для глобального использованияnpm
, вы можете посмотреть короткий код и посмотреть, как работает этот метод.источник
NODE_PATH
том, что вам не нужно менять код. (мой вариант использования - оценка многих студенческих проектов, где я не хочу запускатьnpm install
каждый из них, а также не хочу, чтобы они предоставлялиnode_modules
каталог).requireg
во-первых, в этом весь смысл.Для утилит CLI, которые зависят от больших модулей, например
puppeteer
, я люблю порождать anpm root -g
и использовать его для запроса глобального модуля.источник
Вы можете поместить эту строку в свой
.profile
файл:Это позволит
node
использовать глобальный путь.источник
node_modules
. Это старый ответ, но я помню, что получил его где-то в документации. Во всяком случае, на моем компьютере (в 2020 году) глобальныйnode_modules
каталог npm естьusr/lib/node_modules
. В любом случае, я верю,npm config get prefix
потому что он используется глобально npm всякий раз, когда установлен глобальный пакет, поэтому он должен быть правильным.package.json
файле или вyarn.lock
/package-lock.json
.node_modules
папки на предмет наличия папки, затем ее родительской, потом родительской, ... пока не найдетnode_modules
папку, содержащую этот модуль. Однако, если вы устанавливаете пакет глобально, он не будет находиться внутри какой-либоnode_modules
папки выше текущего каталога скрипта, поэтому вы используете NODE_PATH в качестве запасного варианта, когда узел будет искать пакеты.