28 января 2016 г.

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. Чтобы приготовить омлет, нужно разбить несколько яиц. Иногда в этих яйцах есть маленькие красные пятнышки, но это нормально.

28 января 2016 г.

В версии 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 работать в своем приложении без дальнейших происшествий. Но если вы все еще видите проблемы, возможно, пришло время сделать все возможное:

  1. Во-первых, сядьте на корточки и держитесь за стол одной рукой.
  2. Другой рукой аккуратно выколите npm install --force на клавиатуре.
  3. Нажмите <enter>, затем нервно посмотрите на экран. Постарайтесь не потерять равновесие. Надеюсь, через несколько секунд все будет хорошо. Но если нет, используйте ядерный вариант с npm cache clear, а затем попробуйте принудительно установить еще раз.
  4. Если это не работает, отойдите на секунду. Послушайте немного TLC и налейте себе игристого виноградного сока. Когда почувствуете, что готовы, переходите к следующему шагу. Только ты узнаешь, когда будешь готов.
  5. Освежив свой разум, покопайтесь немного в консольном выводе NPM и посмотрите, не выскакивает ли что-нибудь. Если вы в растерянности, зайдите на GitHub и откройте вопрос в репозитории Sails. Один из нас поможет вам как можно скорее.