Глобальная установка NPM «не могу найти модуль»

206

Я написал модуль, который недавно опубликовал для npm (https://npmjs.org/package/wisp)

Так что он отлично устанавливается из командной строки:

$ npm i -g wisp

Однако, когда я запускаю его из командной строки, я получаю сообщение об ошибке, что оптимист не установлен:

$ wisp 
Error: Cannot find module 'optimist'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)

Тем не менее, я указал в package.json как зависимость:

{
  "name": "wisp",
  "author": "Brendan Scarvell <bscarvell@gmail.com>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

Кто-нибудь знает, что нужно сделать, чтобы это заработало? Я знаю, что это связано с тем, что часть bin добавляет исполняемый файл в bin, а node_modules в этом каталоге пустые. Не знаю, как решить эту проблему.

Menztrual
источник
что произойдет, если вы установите без опции -g?
Винар
Он устанавливает папку node_modules в текущем каталоге, в котором есть пучок.
Menztrual
Я знаю. Вы все еще получаете ошибку?
Винар
Ага. Если я пытаюсь запустить wisp после выполнения локального npm, то wisp все равно возвращает ту же ошибку
Menztrual
Я только что установил твой модуль. Это работает нормально для меня. Где твой пучок? В моем случае я бежал, ./node_modules/wisp/wispкоторый работает отлично.
Винар

Ответы:

370

Для всех, кто сталкивался с этим, у меня была эта проблема из-за моей npmустановки в местоположение, которое не на моем NODE_PATH.

[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH

Мой NODE_PATH был пуст, и запуск npm install --global --verbose promised-ioпоказал, что он устанавливается в /opt/lib/node_modules/promised-io:

[root@uberneek ~]# npm install --global --verbose promised-io
npm info it worked if it ends with ok
npm verb cli [ '/opt/bin/node',
npm verb cli   '/opt/bin/npm',
npm verb cli   'install',
npm verb cli   '--global',
npm verb cli   '--verbose',
npm verb cli   'promised-io' ]
npm info using npm@1.1.45
npm info using node@v0.8.4
[cut]
npm info build /opt/lib/node_modules/promised-io
npm verb from cache /opt/lib/node_modules/promised-io/package.json
npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
[cut]

Мой скрипт не работает на require('promised-io/promise'):

[neek@uberneek project]$ node buildscripts/stringsmerge.js 

module.js:340
    throw err;
          ^
Error: Cannot find module 'promised-io/promise'
    at Function.Module._resolveFilename (module.js:338:15)

Я, вероятно, установил узел и npm из источника, используя configure --prefix=/opt. Я понятия не имею, почему это сделало их неспособными найти установленные модули. На данный момент исправление заключается в том, чтобы указать NODE_PATH в правильном каталоге:

export NODE_PATH=/opt/lib/node_modules

Мой require('promised-io/promise')сейчас преуспевает.

NEEK
источник
10
где установить этот NODE_PATH ??
песчаная
8
@ sandy, где вы устанавливаете переменную среды NODE_PATH, зависит от вашей операционной системы. Я использую разновидность Linux, поэтому я использовал export NODE_PATH=...ее в локальной оболочке так, чтобы она экспортировалась в команды, запускаемые в этой оболочке. Чтобы сделать изменение постоянным или доступным для всех оболочек, поместите его в .profile или аналогичный. Концепция в целом очень сложна для новичка, попробуйте прочитать help.ubuntu.com/community/EnvironmentVariables . Для Windows вы захотите перейти на Linux. ОК, шучу. Попробуйте computerhope.com/issues/ch000549.htm или Google.
Neek
13
Для OSX Lion, следующее работало для меня ... export NODE_PATH = / usr / local / lib / node_modules Я использовал 'locate node_modules', чтобы отследить правильный путь.
k1eran
2
NODE_PATH работает и для WINDOWS. это связано с тем, что узлы могут быть установлены как локально, так и глобально.
звон
5
Если вы установили Node.js с Homebrew на Mac OS X: запустите open -a TextEdit ~/.bash_profileв терминале, а затем добавьте export NODE_PATH=/usr/local/lib/node_modulesв конец файла. Перезапустите окно терминала. Теперь бег echo $NODE_PATHдолжен распечатать /usr/local/lib/node_modules.
Pwdr
39

добавьте это в начало прог (mac):

module.paths.push('/usr/local/lib/node_modules');

Кандо Чжоу
источник
4
Любой способ сделать это не специфическим для ОС способом?
UpTheCreek,
@UpTheCreek это является специфическим способом без ОС. Это код JS, вам просто нужно указать на node_modules с модулями, которые вы ищете
Adelin
@Adelin - это решение для конкретной ОС, потому что расположение глобальных модулей_узлов зависит от ОС. Например, если вы разрабатываете для Windows и работаете под Linux, то это не очень хорошее решение.
UpTheCreek
Это легко преодолеть. Например, вы можете сохранить путь к узлу в переменной env, например, и заменить жестко закодированный путь os.environ.nodepath(что-то вроде этих строк).
Аделин
macOS Mojave 10.14.6 требует добавления экспорта NODE_PATH = / usr / local / lib / node_modules / npm / node_modules в ~ / bash_profile, который является более машинно-независимым в том смысле, что собственный код .js не затронут.
Втв
16

По умолчанию узел не ищет внутри / usr / local / lib / node_module для загрузки глобальных модулей. См. Загрузку модуля, описанную в http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Поэтому вам нужно либо 1) добавить / usr / local / lib / node_module в NODE_PATH и экспортировать его, либо 2) скопировать установленные модули узлов в / usr / local / lib / node. (Как объяснено в ссылке для загрузки модуля, узел будет искать по этому пути и будет работать)

хаотичность
источник
10

Для некоторых (как я), которые больше ничего не работали, попробуйте это:

brew cleanup
brew link node
brew uninstall node
brew install node

Надеюсь, это поможет кому-то :)

Будет
источник
9

Следующее общее исправление будет для любого модуля. Например с request-promise.

замещать

npm install request-promise --global

С участием

npm install request-promise --cli

работал ( источник ), а также для globalsиinherits

Также попробуйте установить переменную среды

NODE_PATH=%AppData%\npm\node_modules
Мохаммед Замир
источник
3

$ vim /etc/profile.d/nodejs.sh

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"
user1959076
источник
Это там по умолчанию. Для пользователей он загружен, но при запуске от имени root его нет, поэтому его необходимо включить в путь пользователя root.
Stamster
2

Для Windows, из Nodejs не удается найти установленный модуль в Windows? у меня получилось запустить ссылку npm как в

npm link wisp
ВЕЧЕРА
источник
Тем не менее, предостережение - я сделал это, но не смог тогда использовать свой zip-код с AWS lambda. Я должен был иметь node_module созданное локально , как и в npm install wisp --save(без опции -g)
PM
2

Для пользователей Mac лучше всего использовать ручную установку:

Чтобы минимизировать вероятность ошибок разрешений, вы можете настроить npm для использования другого каталога. В этом примере это будет скрытый каталог в вашей домашней папке.

  1. Сделайте резервную копию вашего компьютера перед началом работы.

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

    mkdir ~ / .npm-global

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

    Префикс конфигурации npm '~ / .npm-global'

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

    экспорт PATH = ~ / .npm-global / bin: $ PATH

  5. Вернитесь в командную строку и обновите системные переменные:

    источник ~ / .profile

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

    npm install -g jshint

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

NPM_CONFIG_PREFIX=~/.npm-global

Ссылка: https://docs.npmjs.com/getting-started/fixing-npm-permissions

Шиванш Раджпут
источник
1

Была такая же проблема на одном из тестовых серверов, работающих Ubuntuпод root. Затем создается новый пользователь , использующий useradd -m myuserи установил все ( nvm, node, пакеты) в качествеmyuser . Теперь работает нормально.

Дмитрий
источник
1

На Windows, если вы только что сделали чистую установку, и вы получите это, вам нужно сдуть свой npm-кэш в \ AppData \ Roaming

Дмитрий
источник
1

В моем случае оба node и npmбыли в одном пути ( /usr/bin). Он NODE_PATHбыл пуст, поэтому npmразмещал глобальные модули /usr/lib/node_modulesтам, где require(...)успешно их находил. Единственным исключением был npmмодуль, который шел с пакетом nodejs. Поскольку я использую 64-битную систему, она была помещена в /usr/lib64/node_modules. Это не тот случай, когда требуется (...) поиск в случае пустого NODE_PATHи начавшегося узла /usr/bin. Итак, у меня было два варианта:

  • ссылка /usr/lib64/node_modules/npmна/usr/lib/node_modules/npm
  • переместить модули из /usr/lib/node_modules/*в /usr/lib64/node_modules/и установитьNODE_PATH=/usr/lib64/node_modules

Оба работали. Я использую OpenSUSE 42.1 и пакет nodejs из репозитория обновлений. Версия 4.4.5.

GT.
источник
1

Я сделал это простым способом ...

  1. Удалить узел из панели управления [Windows 7]
  2. Установите узел снова
  3. Установите транспортир npm install --global --verbose protractor
    Обновление менеджера веб-драйверов.

у меня отлично работает

Надеюсь, это поможет вам ....

Сантош V
источник
1

Я получил эту ошибку Error: Cannot find module 'number-is-nan' тогда как модуль действительно существует. Это произошло из-за плохой / неполной установки Node.js.

Для Windows, как подсказывают другие ответы, вам нужна чистая установка Node :

  • Удалить Node.js
  • Удалите две папки npmиnpm_cache вC:\Users\user\AppData\Roaming
  • Перезагрузите Windows и установите Node.js
  • Запустить npm initили ( npm init --yesдля конфигурации по умолчанию )
  • Установите переменную среды Windows для NODE_PATH. Этот путь - то, где ваши пакеты установлены. Это наверное что то типаNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Запустите новую консоль cmd и она npmдолжна нормально работать

Примечание :

Попробуйте последние пункты перед переустановкой Node.js, это может сэкономить вам время и избежать переустановки всех ваших пакетов.

alain.janinm
источник
1

Я только что встретил эту проблему axiosмодуля. Тогда я попробовал это: запустить rm -rf node_modulesи yarn. И это работает.

Finedy
источник
0

У меня была та же ошибка, что и у ОП, но копаясь в логах я видел sh: node: command not found .

Оказывается, что программа / usr / bin / node (symlink) больше не устанавливается с apt install nodejs. Однажды символическая /usr/bin/node' toссылка на nodejs, npm install -g @ angular / cli` завершился успешно.

Правильный способ установить это на Debian есть apt install nodejs-legacy.

Майк
источник
0

Мне пришлось добавить C: \ Users \ {Имя пользователя} \ AppData \ Roaming \ npm в мои переменные env, а затем я мог установить вещи.

Rainhider
источник