Как развернуть приложение 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 --productionhttps://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 -Aetc.) а потом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/