Я следовал основным инструкциям по началу работы для node.js на Heroku:
https://devcenter.heroku.com/categories/nodejs
Эти инструкции не говорят вам создавать .gitignore node_modules, и поэтому подразумевают, что node_modules должны быть зарегистрированы в git. Когда я включаю node_modules в git, моё приложение запускается правильно.
Когда я последовал более сложному примеру:
https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (источник)
Он поручил мне добавить node_modules в .gitignore. Поэтому я удалил node_modules из git, добавил его в .gitignore, а затем повторно развернул. На этот раз развернуто не удалось так:
-----> Heroku receiving push
-----> Node.js app detected
-----> Resolving engine versions
Using Node.js version: 0.8.2
Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
Error: npm doesn't work with node v0.8.2
Required: node@0.4 || 0.5 || 0.6
at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
at Module._compile (module.js:449:26)
Error: npm doesn't work with node v0.8.2
Required: node@0.4 || 0.5 || 0.6
at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
at Module._compile (module.js:449:26)
Dependencies installed
-----> Discovering process types
Procfile declares types -> mongod, redis, web
-----> Compiled slug size is 5.0MB
-----> Launching... done, v9
Запуск "Heroku PS" подтверждает падение. Хорошо, нет проблем, поэтому я откатил изменения, добавил node_module обратно в репозиторий git и удалил его из .gitignore. Тем не менее, даже после возврата я получаю то же сообщение об ошибке при развертывании, но теперь приложение снова работает правильно. Запуск "heroku PS" говорит мне, что приложение работает.
Итак, мой вопрос, как правильно это сделать? Включить node_modules или нет? И почему я все еще получаю сообщение об ошибке при откате? Я думаю, что хранилище git находится в плохом состоянии на стороне Heroku?
node_modules
регистрируйтесь в приложениях Heroku.Ответы:
Второе обновление
FAQ больше не доступен.
Из документации
shrinkwrap
:Шеннон и Стивен упоминали об этом раньше, но я думаю, это должно быть частью принятого ответа.
Обновить
Источник, указанный для приведенной ниже рекомендации , был обновлен . Они больше не рекомендуют, чтобы
node_modules
папка была зафиксирована.Оригинальный пост
Для справки, npm FAQ четко отвечает на ваш вопрос:
и для некоторого хорошего обоснования этого прочитайте пост Mikeal Rogers об этом .
Источник: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
источник
.gitignore
? Таким образом, исходный код находится в git, а любые скомпилированные компоненты - нет, аналогично тому, какdist
илиoutput
gitignored папки в проектах grunt и gulp.Моя самая большая проблема с тем, чтобы не проверять
node_modules
git, - это то, что через 10 лет, когда ваше производственное приложение все еще используется, npm может не появиться. Или npm может быть поврежден; или сопровождающие могут решить удалить библиотеку, на которую вы полагаетесь, из своего хранилища; или версия, которую вы используете, может быть урезана.Это можно смягчить с помощью менеджеров репо, таких как maven, потому что вы всегда можете использовать свой собственный локальный Nexus или Artifactory для поддержки зеркала с пакетами, которые вы используете. Насколько я понимаю, такой системы не существует для npm. То же самое касается менеджеров библиотек на стороне клиента, таких как Bower и Jamjs.
Если вы отправили файлы в свое собственное git-репо, вы можете обновить их, когда захотите, и у вас будет комфортная повторяемая сборка и знание того, что ваше приложение не сломается из-за каких-либо сторонних действий.
источник
Вы не должны включать
node_modules
в свой.gitignore
(или, скорее, вы должны включитьnode_modules
в свой источник, развернутый в Heroku).Если
node_modules
:npm install
будут использовать эти библиотеки и будут перестраивать любые бинарные зависимостиnpm rebuild
.npm install
придется самому извлекать все зависимости, что добавляет время к этапу компиляции слагов.Посмотрите исходный код Node.js buildpack для этих точных шагов
Однако первоначальная ошибка выглядит несовместимой между версиями
npm
иnode
. Рекомендуется всегда явно указывать свойengines
раздел вpackages.json
соответствии с данным руководством, чтобы избежать следующих ситуаций:Это обеспечит равенство между разработчиками и снизит вероятность возникновения подобных ситуаций в будущем.
источник
Я собирался оставить это после этого комментария: Должен ли я включить node_modules для git при создании приложения node.js на Heroku?
Но stackoverflow форматировал это странно. Если у вас нет идентичных машин и вы проверяете в node_modules, сделайте .gitignore для собственных расширений. Наш .gitignore выглядит так:
Проверьте это, сначала проверив все, а затем попросите другого разработчика сделать следующее:
Убедитесь, что файлы не изменены.
источник
Я считаю, что
npm install
не должен работать в производственной среде. Есть несколько вещей, которые могут пойти не так - сбой npm, загрузка новых зависимостей (shrinkwrap, похоже, решил эту проблему) - две из них.С другой стороны,
node_modules
не должно быть совершено на мерзавца. Помимо их большого размера, коммиты, включая их, могут отвлекать.Наилучшие решения будут такими: они
npm install
должны работать в среде CI, аналогичной производственной среде. Все тесты будут выполнены, и будет создан заархивированный файл выпуска, который будет включать все зависимости.источник
Я использовал как фиксацию в папке node_modules, так и упаковку в термоусадочную пленку. Оба решения не сделали меня счастливым.
Вкратце: зафиксированный node_modules добавляет слишком много шума в хранилище.
И управлять shrinkwrap.json нелегко, и нет никаких гарантий, что какой-нибудь сжатый проект будет построен через несколько лет.
Я обнаружил, что Mozilla использует отдельный репозиторий для одного из своих проектов https://github.com/mozilla-b2g/gaia-node-modules
Поэтому мне не потребовалось много времени, чтобы реализовать эту идею в инструменте CLI узла https://github.com/bestander/npm-git-lock
Непосредственно перед каждой сборкой добавляйте
npm-git-lock --repo [git@bitbucket.org: ваши / выделенные / node_modules / git / repository.git]
Он вычислит хеш вашего package.json и либо извлечет содержимое node_modules из удаленного репо, либо, если это первая сборка для этого package.json, выполнит очистку
npm install
и отправит результаты в удаленное репо.источник
Для меня сработало явное добавление версии npm в package.json («npm»: «1.1.x») и НЕ проверка в node_modules для git. Это может быть медленнее для развертывания (так как он загружает пакеты каждый раз), но я не смог заставить пакеты скомпилировать, когда они были возвращены. Heroku искал файлы, которые существовали только в моем локальном ящике.
источник
Вместо проверки в node_modules, создайте файл package.json для своего приложения.
Файл package.json определяет зависимости вашего приложения. Затем Heroku может указать npm установить все эти зависимости. Учебник, на который вы ссылаетесь, содержит раздел о файлах package.json.
источник
Я использую это решение:
node_modules
. Если у вас есть собственные модули, которые должны быть собраны для конкретной платформы, создайте отдельный репозиторий для каждой платформы.git submodule
:git submodule add .../your_project_node_modules_windows.git node_modules_windows
git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64
node_modules
наnode_modules
каталог и добавьтеnode_modules
в.gitignore
.npm install
.Таким образом, вы можете легко переключаться между
node_modules
различными платформами (например, если вы разрабатываете на OS X и развертываете на Linux).источник
С https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :
Изменить: Первоначальная ссылка была этой, но теперь она мертва. Спасибо @Flavio за то, что указал на это.
Моя любимая часть:
источник
http://nodejs.org/api/modules.html
Если вы катите свои собственные модули, специфичные для вашего приложения, вы можете оставить эти ( и только те ) в своем приложении
/node_modules
. И переместить все остальные зависимости в родительский каталог.Этот пример использования довольно замечательный, он позволяет вам красиво хранить модули, созданные вами специально для вашего приложения, и не загромождать ваше приложение зависимостями, которые могут быть установлены позже.
источник
сценарий 1:
Один сценарий: вы используете пакет, который удаляется из npm. Если у вас есть все модули в папке node_modules, то это не будет проблемой для вас. Если у вас есть только имя пакета в package.json, вы больше не сможете его получить. Если пакету менее 24 часов, вы можете легко удалить его из npm. Если возраст старше 24 часов, вам необходимо связаться с ними. Но:
читать далее
Так что шансы на это невелики, но есть сценарий 2 ...
сценарий 2:
Другой сценарий, в котором это происходит: вы разрабатываете версию своего программного обеспечения или очень важного программного обеспечения для предприятия и пишете в свой package.json:
Вы используете метод
function1(x)
этого пакета.Теперь разработчики studpid-package переименовывают метод
function1(x)
в,function2(x)
и они делают ошибку ... Они изменяют версию своего пакета с1.0.1
на1.1.0
. Это проблема, потому что приnpm install
следующем вызове вы примете версию,1.1.0
потому что вы использовали тильду ("studpid-package": "~1.0.1"
).Вызов
function1(x)
может вызвать ошибки и проблемы сейчас.Перенос всей папки node_modules (часто более 100 МБ) в ваш репозиторий обойдется вам в пространство памяти. Несколько килобайт (только package.json) по сравнению с сотнями МБ (package.json & node_modules) ... Подумайте об этом.
Вы можете сделать это / должны подумать об этом, если:
программное обеспечение очень важно.
это стоит ваших денег, когда что-то не получается.
Вы не доверяете реестру npm. npm централизован и теоретически может быть отключен.
Вам не нужно публиковать папку node_modules в 99,9% случаев, если:
Вы разрабатываете программное обеспечение только для себя.
Вы что-то запрограммировали и просто хотите опубликовать результат на GitHub, потому что это может заинтересовать кого-то другого.
Если вы не хотите, чтобы node_modules присутствовали в вашем хранилище, просто создайте
.gitignore
файл и добавьте строкуnode_modules
.источник