TL;DR — если вы только что установили новую версию Node, проверьте версию NPM. Если вы используете NPM v3.3.12 (по умолчанию для Node 5.5.0), вы можете столкнуться с проблемами при установке зависимостей в своем приложении Sails. К счастью, NPM исправил это довольно быстро, поэтому все, что вам нужно сделать, это обновить NPM до последней версии (npm install -g npm@latest
), и все будет в порядке.
Версия 3.0 NPM (Node Package Monger) значительно изменила способ сохранения зависимостей в приложениях Node. Раньше папка node_modules/
вашего проекта содержала глубоко вложенное дерево подпапок, каждая из которых представляла зависимость вашего проекта. Каждая из этихnode_modules/
папок содержит дополнительные зависимости, каждая из которых содержит собственную папку node_modules/
для размещения своих зависимостей и т. д.
mySweetApp ├─┬ node_modules │ ├─┬ [email protected] (top level dep) │ │ ├── node_modules │ │ │ ├── [email protected] (2nd level dep) │ ├─┬ [email protected] (top level dep) │ │ ├── node_modules │ │ │ ├── [email protected] (2nd level dep)
etc...
Это позволило выполнить некоторые оптимизации при запуске npm install
(зависимость второго уровня не будет установлена, если она соответствует существующей зависимости верхнего уровня). Но в дереве оставалось еще много избыточных пакетов.
Итак, NPM внесла большие изменения. Начиная с версии 3.0, все зависимости теперь сохраняются в папке node_modules/
верхнего уровня, если только не требуется несколько версий одной и той же зависимости:
mySweetApp ├─┬ node_modules │ ├── [email protected] │ ├── [email protected] │ ├── [email protected]
etc...
Это имеет потенциал для значительного сокращения избыточности. Если для вашего приложения требуются как packageA
, так и packageB
, и для обоих из них требуются совместимые версии packageC
, оно будет установлено только один раз (на верхнем уровне), а не дважды (в папках node_modules/
как packageA
, так и packageB
).
Изменение парадигмы NPM 3 со временем вызвало несколько проблем с совместимостью, но в конечном итоге это было правильное решение, поскольку оно уменьшает объем избыточных данных, которые вам необходимо загрузить и сохранить на своем ноутбуке или сервере при запуске npm install
. Чтобы приготовить омлет, нужно разбить несколько яиц. Иногда в этих яйцах есть маленькие красные пятнышки, но это нормально.
В версии 3.3.10 появилась ошибка, которая при некоторых обстоятельствах приводит к тому, что NPM неправильно удаляет зависимость из папки node_modules/
верхнего уровня и размещает ее ниже в дереве, нарушая любой код, который require()
s этот модуль на верхнем уровне. Ошибка была исправлена в версии 3.4.1, и при использовании этого обновления установка работает должным образом.
Но имейте в виду: на момент написания этой статьи последняя стабильная версия Node (5.5.0) поставляется в комплекте с NPM версии 3.3.12, в которой все еще есть ошибка. Чтобы проверить версию NPM, которую вы установили, запустите:
npm -v
Если вы используете NPM v3.3.12, вам следует перейти на исправленную версию. Для этого:
npm install -g npm@latest
Откиньтесь назад, скрестите ноги и наслаждайтесь установкой.
Искренне,
Команда Sails.js
P.S. После обновления вы сможете npm install
работать в своем приложении без дальнейших происшествий. Но если вы все еще видите проблемы, возможно, пришло время сделать все возможное:
- Во-первых, сядьте на корточки и держитесь за стол одной рукой.
- Другой рукой аккуратно выколите
npm install --force
на клавиатуре. - Нажмите
<enter>
, затем нервно посмотрите на экран. Постарайтесь не потерять равновесие. Надеюсь, через несколько секунд все будет хорошо. Но если нет, используйте ядерный вариант сnpm cache clear
, а затем попробуйте принудительно установить еще раз. - Если это не работает, отойдите на секунду. Послушайте немного TLC и налейте себе игристого виноградного сока. Когда почувствуете, что готовы, переходите к следующему шагу. Только ты узнаешь, когда будешь готов.
- Освежив свой разум, покопайтесь немного в консольном выводе NPM и посмотрите, не выскакивает ли что-нибудь. Если вы в растерянности, зайдите на GitHub и откройте вопрос в репозитории Sails. Один из нас поможет вам как можно скорее.