NodeJS требует глобального модуля / пакета

Я пытаюсь установить глобально, а затем использовать forever и forever-monitor следующим образом:

npm install -g forever forever-monitor

Я вижу обычный вывод, а также операции, которые копируют файлы на глобальный путь, но затем, если я попытаюсь require("forever"); Я получаю сообщение о том, что модуль не найден.

Я использую последнюю версию как узла, так и npm, и я уже знаю об изменении, которое npm делает в глобальной или локальной установке, но я действительно не хочу устанавливать localy для каждого проекта, и я работаю на платформе, которая не работает ‘t поддерживать link так что link npm link после глобальной установки для меня невозможна.

Мой вопрос: почему я не могу требовать установку на глобальном уровне? Это функция или ошибка? Или я делаю что-то неправильно?

PS: Просто, чтобы сделать его кристально чистым: я не хочу устанавливать локально.

В Node.js требуется не искать в папке, где установлены глобальные модули.

Вы можете исправить это, установив переменную среды NODE_PATH. В Linux это будет:

 export NODE_PATH=/usr/lib/node_modules 

Примечание. Это зависит от того, где установлены ваши глобальные модули.

См. Загрузка из глобальных папок .

После установки пакета по всему миру вам необходимо связать локальный проект с глобальным пакетом

 npm install express -g cd ~/mynodeproject/ npm link express 

См. Здесь

Извинения за некромантию, но я могу указать жестко закодированные пути к глобально установленным модулям:

 var pg = require("/usr/local/lib/node_modules/pg"); 

Это не идеально, но, учитывая, что Unity3d пытается «скомпилировать» весь javascript, который включен в каталог проекта, я действительно не могу установить какие-либо пакеты.

Я знаю, что это старый вопрос, но я столкнулся с этим, пытаясь выполнить некоторую проверку версий с помощью semver в сценарии semver в package.json . Поскольку я знал, что не могу зависеть от каких-либо установленных локальных модhive, я использовал это, чтобы требовать semver из глобальной папки node_modules (поскольку от нее зависит ее число, я знаю, что она есть):

 function requireGlobal(packageName) { var childProcess = require('child_process'); var path = require('path'); var fs = require('fs'); var globalNodeModules = childProcess.execSync('npm root -g').toString().trim(); var packageDir = path.join(globalNodeModules, packageName); if (!fs.existsSync(packageDir)) packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm if (!fs.existsSync(packageDir)) throw new Error('Cannot find global module \'' + packageName + '\''); var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString()); var main = path.join(packageDir, packageMeta.main); return require(main); } 

Мне нравится этот подход, потому что для этого не требуется установка каких-либо специальных модhive.

Я не пошел с решением NODE_PATH как предлагали другие, поскольку я хотел, чтобы это работало на чьей-то машине, без необходимости требовать дополнительной настройки / настройки перед запуском npm install для моего проекта.

Как это закодировано, гарантируется только найти модули верхнего уровня (установленные с использованием npm install -g ... ) или модули, необходимые для npm (здесь указаны dependencies : https://github.com/npm/npm/ blob / master / package.json ). Если вы используете более новую версию NPM, она может найти зависимости от других глобально установленных пакетов, поскольку теперь существует более node_modules структура для папок node_modules .

Надеюсь, это кому-то полезно.

Вы можете использовать пакет requireg для решения этой проблемы:

 var forever = require('requireg')('forever') 

будет делать трюк.

Кроме того, есть еще один модуль global-npm , хотя он специфичен только для использования глобальной npm , вы можете посмотреть на короткий код и посмотреть, как работает эта техника.

Согласно документации , Node.js по умолчанию будет искать в следующих местах:

  1. $HOME/.node_modules (глобальный)

    Примечание: $HOME является домашним каталогом пользователя.

  2. $HOME/.node_libraries (глобальный)
  3. $PREFIX/lib/node (глобальный)

    Примечание. $PREFIX – это настроенный node_prefix для node_prefix

    Чтобы проверить текущее значение node_prefix , запустите:

     node -p process.config.variables.node_prefix 

    Примечание. Префикс соответствует параметру --prefix во время сборки и относится к process.execPath . Не путать со значением команды npm config get prefix . источник

  4. Текущая папка node_modules . (местный)

  5. Путь, указанный в переменной среды NODE_PATH .

    Примечание. NODE_PATH окружения NODE_PATH установлена ​​в список абсолютных путей с разделителем двоеточия.

Если данный модуль не может быть найден, это означает, что он отсутствует в одном из указанных выше местоположений.

Местоположение глобальной корневой папки, в которой установлены модули, может быть напечатано: npm root -g (по умолчанию путь вычисляется во время выполнения, если не переопределено в файле npmrc ).

Решение

Вы можете попробовать следующие обходные пути:

  • Укажите глобальное расположение модуля в переменной среды NODE_PATH . Например

     echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 

    Чтобы проверить и распечатать значение NODE_PATH , выполните:

     echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 
  • Чтобы получить более постоянное решение, $HOME/.node_modules глобальную пользовательскую папку $HOME/.node_modules чтобы указать на корневую папку, выполнив $HOME/.node_modules команду:

     ln -vs "$(npm root -g)" "$HOME"/.node_modules 

    Затем повторите проверку через: echo 'require("forever")' | node echo 'require("forever")' | node .

  • Временно измените текущую папку на то, где расширение было установлено глобально, перед вызовом скрипта. Например

     npm install -g forever cd "$(npm root -g)" echo 'require("forever")' | node cd - 
  • Настройте глобальный пункт назначения в файле npm userconfig (см. npm help 5 npmrc ) или с userconfig параметра userconfig ( --prefix ).

    Чтобы отобразить текущую конфигурацию, запустите: npm config list .

    Чтобы отредактировать текущую конфигурацию, запустите: npm config edit .

  • Укажите полный путь расположения узлов узла при вызове require() . Например

     require("/path/to/sub/module") 
  • Установите пакет в пользовательское местоположение, например

     npm install forever -g --prefix "$HOME"/.node_modules 

    Тем не менее, установка будет ~/.node_modules/lib/node_modules/ , поэтому местоположение должно быть добавлено.

    См. Локальный пакет установки npm для настраиваемого местоположения

  • Создайте символическую ссылку в текущей папке из местоположения глобального пакета. Например

     npm link forever 

Вы можете поместить эту строку в файл .profile :

экспорт NODE_PATH = “$ (префикс get npm config) / lib / node_modules”

Это заставит node использовать глобальный путь.

  • Android VpnService для захвата пакетов не будет захватывать пакеты
  • Импорт двух функций с одинаковым именем с помощью roxygen2
  • Каким должно быть имя пакета приложения для Android?
  • Пакет Java не содержит ошибки
  • Ошибка при установке пакета R
  • Найдите версию установленного пакета npm
  • Как я могу указать явный заказ ScriptBundle?
  • Как установить пакет R из исходного кода?
  • Как использовать Parcel в Android?
  • inst и extdata в R Packaging
  • Java-пакеты com и org
  • Давайте будем гением компьютера.