Как развернуть приложение node, которое использует grunt для heroku


Я использую grunt, а также плагины grunt, такие как grunt-contrib-copy,grunt-contrib-mincss (который указан как зависимости npm для моего приложения).

также я не совершал и public папка, в которой находятся все сгенерированные файлы. И я не могу понять, как построить мое приложение (у меня есть grunt build команда) после развертывания и настройки моего сервера (он уже ищет ).

Я видел некоторые вещи, как grunt-heroku-deploy, но мне кажется, что это плохая идея, чтобы совершить перед загрузкой. Может быть, есть некоторые нежные решения... Есть мысли?

8 58

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.

  1. убедитесь, что вы у вас есть как grunt, так и grunt-cli, установленные локально в вашем пакете.json, даже если grunt говорит вам установить cli глобально: $:npm i -S grunt grunt-cli

  2. добавьте шаг 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/