Как развернуть приложение node, которое использует grunt для heroku
Я использую grunt, а также плагины grunt, такие как grunt-contrib-copy
,grunt-contrib-mincss
(который указан как зависимости npm для моего приложения).
также я не совершал и public
папка, в которой находятся все сгенерированные файлы. И я не могу понять, как построить мое приложение (у меня есть grunt build
команда) после развертывания и настройки моего сервера (он уже ищет ).
Я видел некоторые вещи, как grunt-heroku-deploy
, но мне кажется, что это плохая идея, чтобы совершить перед загрузкой. Может быть, есть некоторые нежные решения... Есть мысли?
8 ответов:
npm имеет поддержку
postinstall
шаг (среди многих других), что может быть именно то, что вы ищете.узел.js heroku buildpack запускает эту команду при нажатии на heroku для разрешения зависимостей сборки:
$ npm install --production
https://devcenter.heroku.com/articles/nodejs-support#build-behavior
если вы посмотрите на документацию npm, вы можете настроить ряд сценариев для запуска до или после запуска любого
npm install
для вашего пакета. Он настроен вscripts
собственностьpackage.json
. Элементscripts
свойство позволяет запускать пользовательские скрипты (в том числеgrunt
) когда определенные вещи происходят в жизненном цикле пакета.например, чтобы повторить некоторый текст и запустить
grunt
команда всякий раз, когда кто-либо (включая Heroku) работаетnpm install
добавьте это в вашpackage.json
:{ ... "scripts": { "postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt <your task name>" }, ... }
https://npmjs.org/doc/scripts.html
важно предостережения:
- возможно, вам придется изменить путь к двоичному файлу grunt в
postinstall
скрипт, проверьте вывод ошибки, еслиgrunt
команда не выполняется.grunt
иgrunt-cli
должен быть указан какdependency
в своемpackage.json
таким образом, он устанавливается Heroku. Перечислив их вdevDependencies
недостаточно, так как Heroku не будет устанавливать их. Кроме того, обратите внимание, что Heroku не будет устанавливать его как глобальный пакет, поэтому для его выполнения на Heroku вам придется использовать относительный путь (как он настроен выше).если это не работает (вам, вероятно, придется немного повозиться с относительными путями), тогда вы можете подумать о написании ваш собственный buildpack для Heroku.
обновление
по состоянию на 0.4, то
grunt
пакет не содержитgrunt
двоичный, который теперь является частьюgrunt-cli
пакета. Ответ был обновлен, чтобы отразить это.
похоже, что это будет в значительной степени решена, когда Heroku Platorm API
slug
иrelease
особенности делают его в хребтину. В этот момент Вы можете создать свой код локально (или на сервере ci), упаковать его и отправить его heroku через вызов API и освободить его оттуда.Это все еще в бета-периоде и было объявлено только 19 декабря 2013 года.
https://devcenter.heroku.com/articles/platform-api-deploying-slugs
Я никогда не был очень доволен тем, сколько людей казалось в порядке с проверкой вашего сгенерированного кода в git или npm postinstall hook. : (
Плюс с философской точки зрения, выполнение сборки во время выпуска-это просто еще одна потенциальная точка отказа.
просто для удовольствия: поскольку это еще не завершено,вот Баш скрипт я бросил вместе вы можете использовать на данный момент, чтобы построить свой код на ветке развертывания, зафиксировать его, развернуть его в heroku, а затем удалить ветку развертывания. (Я действительно не поклонник сценариев развертывания bash, поэтому я действительно С нетерпением ждем дополнения API платформы)
#!/bin/bash set -e # Delete current deploy branch git branch -D deploy # Create new deploy branch based on master git checkout -b deploy # Grunt comands to build our site grunt build:production # the dist/ directory is in my .gitignore, so forcibly add it git add -f dist/ git commit -m "Deploying to Heroku" # Push it up to heroku, the -f ensures that heroku won't complain git push heroku -f deploy:master # Switch it back to master git checkout master
Grunt (et al.) это инструмент сборки, а не (действительно) то, что вы должны упаковывать и запускать на производстве. Другим подходом было бы использовать Grunt для подготовки вашего проекта локально (или лучше на сервере CI), прежде чем только нажимать встроенные файлы на Heroku. Как уже упоминалось Heroku будет делать
npm install
на вашем приложении после его толкнул, который должен быть достаточно сам по себе, чтобы, наконец, подготовить приложение.Я его настроил так, что хрюканье производное / построенное приложение Heroku живет в a совершенно отдельный репозиторий Git, чтобы мой основной источник приложения РЕПО код. Так что когда я делаю
grunt deploy
он оптимизирует и копирует соответствующие файлы в репозиторий Heroku, приводит его в порядок (git add -A
etc.) а потомgit push heroku master
(или что-то еще).кажется, что более чистое разделение проблем, если ваши живые серверы отвечают только за запуск предварительно созданного пакета приложений.
YMMV конечно, и принятый ответ выше тоже полностью действителен ... особенно на хорошо понятной и стабильной жизни окружающая среда как Heroku.
Heroku buildpack отлично работает для меня. Отличный материал.
чтобы получить эту работу с grunt 4.0 я следовал инструкциям здесь https://discussion.heroku.com/t/grunt-on-heroku/98/2 . Единственное изменение, которое мне нужно было сделать, это удалить путь к grunt, поскольку использование слешей стиля unix приведет к сбою в windows и наоборот. К счастью, вам даже не нужно указывать путь, поскольку NPM будет искать grunt в node_modules/.папка binhttps://npmjs.org/doc/scripts.html#path.
убедитесь, что вы у вас есть как grunt, так и grunt-cli, установленные локально в вашем пакете.json, даже если grunt говорит вам установить cli глобально: $:
npm i -S grunt grunt-cli
добавьте шаг postinstall в свой пакет.JSON, который выглядит так:
"postinstall": "grunt prod"
проверьте этот учебник:https://medium.com/p/c227cb1ddc56. Он объясняет, как можно развернуть приложение на Heroku buildpack-пакет грунт с таможней.
шаг npm postinstall, вероятно, ваш лучший вариант, так как вы можете вызвать grunt оттуда. Но вы также должны проверить пользовательский пакет buildpack, например heroku-buildpack-nodejs-grunt.
этот пост является специфичным для Rails, но я не понимаю, почему вы не можете использовать его с какой-либо внутренней структурой и просто поменять Ruby buildpack на то, что вы используете.
решение в основном заключается в использовании нескольких пакетов сборки и запуске узла/Grunt buildpack
grunt build
для вас право на Heroku.важно отметить, что это решение не требует проверки артефактов сборки в системе управления версиями. (Ура!!!)
http://www.angularonrails.com/deploy-angular-rails-single-page-application-heroku/