Як імпортувати глобальні модулі в Node? Я отримую "Помилка: Неможливо знайти модуль <модуль>"?


145

Я намагаюся налаштувати Node на Mac OSX Lion. Це, здається, працює нормально, але я не можу імпортувати будь-які модулі зі своєї глобальної папки модулів. Я отримую помилку,

Error: Cannot find module <module>

Якщо я запускаю це:, node -e require.pathsя отримую відповідь:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

Це правильно, мої модулі дійсно встановлені в / usr / local / lib / node_modules. Однак, коли я намагаюся запустити сценарій, я отримую таке:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

Мій .bash_profile виглядає так:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

Буду дуже вдячний за допомогу, я не маю уявлення, чому я не можу імпортувати жодну бібліотеку.


1
Ви знаєте, що це не вподобаний спосіб робити справи, правда?
thejh

1
Не могли б ви детальніше? Ви маєте на увазі, що я не повинен встановлювати бібліотеки до моєї глобальної папки?
Ганпан

3
@Hanpan: Кращим способом є встановлення модулів, які ви хочете використовувати, через local ().
thejh

1
Кращу та оновлену відповідь (на яку не покладаються npm link) можна знайти тут: stackoverflow.com/a/15646750/2671392
GGG

1
Я стара школа і звикла встановлювати бібліотеки в глобальних місцях. Я ніколи не бачив жодної переконливої ​​причини для великого використання встановлень місцевої бібліотеки. Клас mongodb, який я беру, закінчиться десь близько ста невеликих проектів до того часу, коли ми закінчимо, кожен з яких містить здебільшого повторюваний набір бібліотек - mongodb, express, консолідація тощо. Перехід на інтерактивні мови залишає депозити місцевих бібліотек всюди. У місцевих сховищах Scala я повинен мати тисячі мов Scala. Дітто-метеор, грунтовний і рубіновий.
Стівен У. Райт

Відповіді:


116

Якщо ви використовуєте npm> = 1.0, ви можете npm link <global-package>створити локальне посилання на пакет, який вже встановлений у всьому світі. ( Caveat: ОС повинна підтримувати символьні посилання. )

Однак це не обійдеться без проблем.

npm-посилання - це інструмент розробки. Це приголомшливо для управління пакунками у вашому вікні локальної розробки Але розгортання за допомогою npm-посилання в основному задає проблеми, оскільки це дуже просто оновлювати речі, не усвідомлюючи цього.

Як альтернатива, ви можете встановлювати пакети як локально, так і в усьому світі.

Додаткову інформацію див


69
Я читаю це і не можу повірити своїм очам. Отже, якщо я встановлюю, скажімо, express, а потім маю 20 проектів, які потрібно створити на вершині express, мені потрібно встановити його 20 разів, для кожного з них, у кожній папці проекту, знову і знову? Я не маю великого досвіду роботи з менеджерами пакунків, але це щось
гарно

25
Це правильно, і якщо ви задумаєтесь, це має сенс. Місцеве управління своїми залежностями зберігає все самостійно і дозволяє вказати конкретну версію залежності для будь-якого конкретного проекту (наприклад, проект foo вимагає експрес 2.x, тоді як проектна панель може використовувати експрес-бета-версія 3).
грахам

43
Я певний час намагався зрозуміти логіку цього, але, спостерігаючи, як мої друзі Ruby борються з оновленнями глобальних пакетів, сперечаються про gemsets і часто просто ніколи не оновлюються, я визнав, що встановлення залежностей на місцях - це єдиний розумний спосіб зробити управління пакетами .
timoxley

3
Я хотів би провести паралель між цією ситуацією та ситуацією зі статичними зв’язками та динамічними бібліотеками, що стосується розповсюдження програмного забезпечення. Врахуйте, що майже всі додатки, розповсюджені в iOS App Store, повинні статично зв’язувати залежності, не передбачені SDK для iOS. Чому це робиться? Пекло глобальної залежності - це дуже реальна річ.
Стівен Лу

1
Також я розумію, що npmкеш (який живе в ~/.npm) зробить доцільним процес перевстановлення, який виконується у ваших різних місцях.
Стівен Лу

85

Node.js використовує змінну навколишнього середовища, NODE_PATHщоб дозволити вказати додаткові каталоги, які слід включити до шляху пошуку модуля. Ви можете використовувати npmсебе, щоб повідомити, де зберігаються глобальні модулі з npm root -gкомандою. Таким чином, склавши ці два разом, ви можете переконатися, що глобальні модулі включені у ваш шлях пошуку за допомогою наступної команди (для Linux-ish)

export NODE_PATH=$(npm root --quiet -g)


3
Дякуємо за NODE_PATHпідказку щодо змінної середовища. Це дуже допомогло!
rekire

7
Це має бути головний коментар
Адам Пракс

Мені довелося встановити NODE_PATHеквівалентний шлях до poix, щоб змусити npm працювати на MSYS2. Дякую.
Джойс Бабу

Працює і з Windows, і з Git bash. Ідеально. :-)
inf3rno

Це робить вашу .node_modulesпапку пошуковою, але для того, щоб імпортувати модулі за допомогою require(), вони все одно повинні бути встановлені у вашому локальному каталозі проектів (або, можливо, пов’язані за допомогою npm link). Глобальні модулі не можуть бути імпортовані в проекти, звідти можна запускати лише бінарні файли / скрипти.
Prahlad Yeri

65

Ви можете використовувати посилання npm для створення символьної посилання на ваш глобальний пакет у папці проектів.

Приклад:

$ npm install -g express
$ cd [local path]/project
$ npm link express

Все, що він робить, - створити локальну папку node_modules, а потім створити express express -> [глобальний каталог] / node_modules / express, який потім може бути вирішений require('express')


Чи сумісна ця між ОС?
UpTheCreek

Новіші версії Windows підтримують його з цієї версії: github.com/npm/npm/commit/… Для старих версій Windows спробуйте npmjs.com/package/npm-junction
Alex

22

Встановіть будь-який пакет у всьому світі, як показано нижче:

$ npm install -g replace  // replace is one of the node module.

Оскільки цей модуль заміни встановлений у всьому світі, тому, якщо ви бачите папку модулів вузлів, ви не побачите там модуля заміни, і тому ви не можете використовувати цей пакет, використовуючи затребування ('заміна').

тому що з вимогою ви можете використовувати лише локальні модулі, які присутні у папці модуля вашого вузла.

Тепер, щоб використовувати глобальний модуль, слід зв’язати його з контуром модуля вузла за допомогою команди нижче.

$ npm link replace

Тепер поверніться назад і перегляньте папку модуля вузла, тепер ви зможете побачити модуль заміни, і ви можете використовувати його з посиланням вимагати ("замінити") у вашій програмі, оскільки він пов'язаний з вашим локальним модулем вузла.

Будь ласка, дайте мені знати, якщо потрібно додаткове роз'яснення.


14

Як аргумент можна використовувати за допомогою шляху до шляху до каталогу глобального модуля.

require('/path/to/global/node_modules/the_module');

На своєму mac я використовую це:

require('/usr/local/lib/node_modules/the_module');

Як знайти, де знаходяться ваші глобальні модулі? -> Де npm встановлює пакети?


7

Встановлення змінної середовища NODE_PATH для вказівки на вашу глобальну node_modulesпапку.

У Windows 7 або новіших версіях шлях є чимось подібним, %AppData%\npm\node_modulesхоча в UNIX може бути щось подібне, /home/sg/.npm_global/lib/node_modules/але це залежить від конфігурації користувача.

Команда npm config get prefixможе допомогти з'ясувати, який правильний шлях.

У системах UNIX ви можете виконати його за допомогою наступної команди:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Я використовую Докер. Я намагаюся створити зображення докера, у якому встановлені всі мої залежності від вузла, але я можу використовувати мій локальний каталог додатків під час роботи контейнера (не забруднюючи його каталогом або посиланням node_modules). Це спричиняє проблеми в цьому сценарії. Моє вирішення полягає в тому, щоб вимагати від точного шляху, де модуль, наприклад, вимагають ('/ usr / local / lib / node_modules / socket.io')


-1

require.paths застаріло.

Перейдіть до папки проекту та введіть

npm install socket.io

який повинен встановити його в локальній папці ./node_modules, де вузол буде шукати його.

Я зберігаю свої речі так:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

Створіть файл app.js

// app.js
var socket = require('socket.io')

тепер запустіть мій додаток

node app.js

Переконайтеся, що ви використовуєте npm >= 1.0та node >= 4.0.


8
Він запитує про використання глобально встановлених пакетів npm.
UpTheCreek

@Jamund. Ви показуєте, як використовувати локально встановлений пакет, але оригінальне питання стосувалося глобальних.
Віталій Маркітанов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.