2014-09-17 4 views
22

Я использую Node.js (через browserify) для каждого из моих веб-приложений, все из которых имеют общие зависимости и другие, специфичные для себя. Каждое из этих приложений имеет файл package.json, который указывает, какие версии этих модулей ему нужны.Как работает установка npm

Прямо сейчас, у меня есть каталог /node_modules в родительской папке моих приложений для модулей, которые все они должны ссылаться, а затем я добавляю в программу папку приложения node_modules в каталог этого приложения. Это прекрасно работает в краткосрочной перспективе, так как операторы require() могут продолжать смотреть вверх в файловой структуре, пока не найдут каталог node_modules с правильным приложением.

Если это становится сложно, когда я хочу вернуться к старому проекту и запустить npm install, чтобы убедиться, что он все еще может найти все необходимые ему зависимости. (Кто знает, что смешно бизнеса произошло с тех пор на уровне родительского каталога.) Я был под впечатлением, что npm install сделал это:

  • для каждого модуля, указанного в package.json, первый чек, если он присутствует, движение вверх каталог таким же образом require делает. Если это не так, установите его в локальный каталог node_modules (при необходимости создав этот каталог).

Когда я запустил npm install внутри папки приложения, однако он, кажется, устанавливает все локально, независимо от того, где еще он может существовать. Это правильное поведение? (Возможно, есть еще одна причина, например, язык плохой версии в моем package.json). Если это правильное поведение, есть ли у меня способ, чтобы npm install вел себя так, как указано выше?

Неплохо распространять модули внутри каждого приложения, но оно бесполезно и не позволяет мне делать небольшие улучшения для общих модулей и не обновлять каждый старый файл package.json. Конечно, это может быть хорошо ...

+0

Вот ссылка. Пожалуйста, пойдите по этой ссылке. Это может быть полезно для вас. [https://www.npmjs.org/doc/cli/npm-shrinkwrap.html](https://www.npmjs.org/doc/cli/npm-shrinkwrap.html) –

ответ

16

Однако, когда я запускаю npm-установку внутри папки приложения, он, кажется, устанавливает все локально, независимо от того, где еще он может существовать. Это правильное поведение? (Возможно, есть еще одна причина, например, язык плохой версии в моем пакете. Json). Если это правильное поведение, есть ли способ, чтобы я установил npm, как указано выше?

Да, это то, что делает npm. В коде node.js алгоритм require имеет определенную последовательность мест, которые он просматривает, в том числе поход по файловой системе. Однако npm install этого не делает. Он просто устанавливается на место. Алгоритмы, которые он использует, ограничены только одним каталогом node_modules под вашим текущим каталогом, и он не будет касаться ничего выше этого (кроме -g).

Неплохо распространять модули внутри каждого приложения, но оно бесполезно и не позволяет мне делать небольшие улучшения для общих модулей и не обновлять каждый старый файл package.json. Конечно, это может быть хорошо ...

Да, в основном вы делаете это неправильно. Регулярный рабочий процесс хорошо масштабируется в Интернете. Для вашего случая использования он создает некоторую дополнительную утомительную работу, но вы также можете просто использовать семантическое управление версиями по назначению и указать "mylib": "^1.0.0" в своем пакете.json для ваших приложений и быть в порядке, автоматически получая новые версии при следующем npm install.

+1

Только то, что мне нужно было знать. Спасибо! –

+1

Чувствую, что немного больше информации о том, что^1.0.0 было бы здорово для людей, которые приходят к этому вопросу, когда приходят на поиски по запросу на npm. –

+0

Как сказал @AlejoBrz, если кто-то хочет получить дополнительную информацию об управлении версиями, посетите страницу https://docs.npmjs.com/getting-started/semantic-versioning –