Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

npm поддерживает шаг postinstall (среди многих других), который может быть именно тем, что вы ищете.

node.js heroku buildpack запускает эту команду, когда вы нажимаете на герою для разрешения зависимостей сборки:

$ 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 script, проверьте вывод ошибки, если команда grunt не выполняется.
  • grunt и grunt-cli должны быть указаны как dependency в вашем package.json, поэтому он будет установлен Heroku. Листинг их в devDependencies недостаточно, так как Heroku не будет устанавливать их. Также обратите внимание, что Heroku не будет устанавливать его как глобальный пакет, поэтому для его выполнения на Heroku вам придется использовать относительный путь (как он настроен выше).

Если это не сработает (вам, вероятно, придется немного поиграть с относительными путями), вы можете захотеть написать свой собственный buildpack для Heroku.

Update

Начиная с версии 0.4, пакет grunt больше не содержит двоичный файл grunt, который теперь является частью пакета grunt-cli. Ответ был обновлен, чтобы отразить это.

Ответ 2

Похоже, что это будет в значительной степени решено, когда функции Heroku Platorm API slug и release войдут в магистраль. В этот момент вы можете создать свой код локально (или на сервере ci), упаковать его и отправить его в герою через вызов API и отпустить его оттуда.

Это все еще в бета-периоде и было объявлено только 19 декабря 2013 года.

https://devcenter.heroku.com/articles/platform-api-deploying-slugs

Я никогда не был очень доволен тем, как много людей выглядели нормально, проверяя ваш сгенерированный код на git или на крючок для установки NPM.:(

Плюс от философской позиции, делать сборку во время выпуска - это просто еще одна потенциальная точка отказа.


Просто для удовольствия. Так как это еще не завершено, здесь bash script, который я собрал вместе, вы можете использовать пока, чтобы создать свой код на ветвь развертывания, зафиксировать ее, развернуть на геройку, а затем удалить ветвь развертывания. (Я действительно не поклонник сценариев развертывания 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

Ответ 3

Grunt (и др.) - инструмент построения, а не (действительно) что-то, что вы должны упаковывать и запускать на производстве. Другой подход заключался бы в том, чтобы использовать Grunt для подготовки проекта локально (или лучше на сервере CI), прежде чем только выталкивать встроенные файлы в Heroku. Как уже упоминалось, Heroku будет делать npm install в вашем приложении после того, как он будет нажат, что должно быть достаточно для того, чтобы, наконец, подготовить ваше приложение.

У меня он настроен так, что созданное Grunch/построенное приложение Heroku живет в полностью отдельном репозитории Git в моем основном репозитории исходного кода приложения. Так что, когда я делаю grunt deploy, он оптимизирует и копирует соответствующие файлы в репозиторий Heroku, подбирает его (git add -A и т.д.), А затем git push heroku master (или что-то еще).

Похоже на более чистое разделение проблем, если ваши серверы живут только за запуск готового пакета приложений.

YMMV, конечно, и принятый ответ выше полностью подходит также... особенно в хорошо понимаемой и стабильной живой среде, такой как Heroku.

Ответ 4

Heroku buildpack отлично работает для меня. Отличный материал.

Ответ 5

Чтобы работать с grunt 4.0, я следил за инструкциями здесь https://discussion.heroku.com/t/grunt-on-heroku/98/2. Единственное изменение, которое я должен был сделать, это удалить путь для хрюкания, поскольку использование стилей в стиле unix приведет к сбою в окнах и наоборот. К счастью, вам даже не нужно указывать путь, поскольку NPM будет искать grunt в папке node_modules/. Bin https://npmjs.org/doc/scripts.html#path.

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

  • добавьте шаг postinstall к вашему package.json, который выглядит следующим образом: "postinstall": "grunt prod"

Ответ 6

Посмотрите этот учебник: https://medium.com/p/c227cb1ddc56. В нем объясняется, как вы можете развернуть приложение grunt на Heroku с помощью специального buildpack.

Ответ 7

Шаг postinstall npm - это, вероятно, ваш лучший вариант, так как вы можете вызывать grunt оттуда. Но вы также должны проверить пользовательский buildpack, например heroku-buildpack-nodejs-grunt.

Ответ 8

Это сообщение специфично для Rails, но я не понимаю, почему вы не можете использовать его с какой-либо внутренней инфраструктурой и просто заменять Ruby buildpack тем, что вы используете.

Решение в основном состоит в использовании нескольких buildpacks и имеет Node/Grunt buildpack grunt build для вас прямо на Heroku.

Значительно, это решение не проверяет сборку артефактов в управлении версиями. (Yay!!!)

http://www.angularonrails.com/deploy-angular-rails-single-page-application-heroku/