web-dev-qa-db-fra.com

Comment déployer une application de nœud qui utilise Grunt sur Heroku

J'utilise des plugins grunt et grunt comme grunt-contrib-copy, grunt-contrib-mincss (qui figurait comme dépendances npm pour mon application).

De plus, je ne m'engage pas npm_modules dossier et public dossier, où se trouvent tous les fichiers générés. Et je ne sais pas comment créer mon application (j'ai grunt build commande) après avoir déployé et configuré mon serveur (il recherche déjà le dossier public).

J'ai vu des trucs comme grunt-heroku-deploy, mais il me semble une mauvaise idée de valider avant le téléchargement. Peut-être qu'il y a des décisions douces ... Des pensées?

58
ValeriiVasin

npm prend en charge une étape postinstall (parmi beaucoup d'autres) qui pourrait être exactement ce que vous recherchez.

Le buildpack node.js heroku exécute cette commande lorsque vous poussez vers heroku pour résoudre les dépendances de build:

$ npm install --production

https://devcenter.heroku.com/articles/nodejs-support#build-behavior

Si vous jetez un œil à la documentation de npm, vous pouvez configurer une série de scripts à exécuter avant ou après l'exécution de npm install pour votre colis. Il est configuré dans la propriété scripts de package.json. La propriété scripts permet d'exécuter des scripts personnalisés (y compris grunt) lorsque certaines choses se produisent dans le cycle de vie d'un package.

Par exemple, pour faire écho à du texte et exécuter la commande grunt chaque fois que quelqu'un (y compris Heroku) exécute npm install, ajoutez ceci à votre package.json:

{
  ...
  "scripts": {
    "postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt <your task name>"
  },
  ...
}

https://npmjs.org/doc/scripts.html

Avertissements importants:

  • Vous devrez peut-être modifier le chemin d'accès au binaire grunt dans le script postinstall, vérifiez la sortie d'erreur si la commande grunt ne s'exécute pas.
  • grunt et grunt-cli doit être répertorié en tant que dependency dans votre package.json donc il est installé par Heroku. Les lister sous devDependencies n'est pas suffisant car Heroku ne les installera pas. Notez également que Heroku ne l'installera pas en tant que package global, donc pour l'exécuter sur Heroku, vous devrez utiliser un chemin relatif (tel qu'il est configuré ci-dessus).

Si cela ne fonctionne pas (vous devrez probablement jouer un peu avec les chemins relatifs), alors vous voudrez peut-être envisager d'écrire votre propre pack de construction personnalisé pour Herok .

Mise à jour

Depuis la version 0.4, le package grunt ne contient plus le binaire grunt, qui fait maintenant partie du grunt-cli paquet. La réponse a été mise à jour pour refléter cela.

85
smithclay

Il semble que cela sera largement résolu lorsque les fonctionnalités de l'API Heroku Platorm slug et release seront intégrées à la ligne principale. À ce stade, vous pouvez créer votre code localement (ou sur un serveur ci), l'empaqueter et l'envoyer à heroku via un appel API et le libérer à partir de là.

Ceci est encore dans la période bêta et n'a été annoncé que le 19 décembre 2013.

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

Je n'ai jamais été très satisfait du nombre de personnes qui semblaient d'accord pour archiver votre code généré dans git ou le hook de post-installation NPM. :(

De plus, d'un point de vue philosophique, faire une build pendant une version est simplement un autre point d'échec potentiel.


Juste pour le plaisir : Puisque ce n'est pas encore finalisé, voici un script bash J'ai jeté ensemble que vous pouvez utiliser pour le moment pour créer votre code sur une branche de déploiement, le valider, le déployer sur heroku, puis supprimer la branche de déploiement. (Je ne suis vraiment pas un fan des scripts de déploiement bash, donc je suis vraiment impatient des ajouts de l'API de la plate-forme)

#!/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
24
Mark G.

Grunt (et al.) Est un outil de construction, pas (vraiment) quelque chose que vous devriez préparer et exécuter en production. Une approche différente serait d'utiliser Grunt pour préparer votre projet localement (ou mieux sur un serveur CI) avant de pousser uniquement les fichiers construits vers Heroku. Comme déjà mentionné, Heroku fera un npm install sur votre application après avoir été poussé, ce qui devrait suffire à lui seul pour enfin préparer votre application.

Je l'ai configuré pour que l'application Heroku dérivée/construite de Grunt vive dans un référentiel Git totalement distinct de celui de mon code source d'application principal. Alors que quand je fais un grunt deploy il optimise et copie les fichiers pertinents dans le référentiel Heroku, le range (git add -A etc.) puis git Push heroku master (ou peu importe).

Cela semble être une séparation plus nette des préoccupations si vos serveurs en direct ne sont responsables que de l'exécution d'un package d'application pré-construit.

YMMV bien sûr, et la réponse acceptée ci-dessus est également totalement valable ... en particulier sur un environnement live bien compris et stable comme Heroku.

23
Jed Richards

Heroku buildpack fonctionne très bien pour moi. Super truc.

6
ValeriiVasin

Pour que cela fonctionne avec grunt 4.0, j'ai suivi les instructions ici https://discussion.heroku.com/t/grunt-on-heroku/98/2 . Le seul changement que j'ai dû faire était de supprimer le chemin de grognement car l'utilisation de barres obliques de style Unix le ferait échouer dans Windows et vice versa. Heureusement, vous n'avez même pas besoin de spécifier le chemin, car NPM recherchera grunt dans le dossier node_modules/.bin https://npmjs.org/doc/scripts.html#path .

  1. assurez-vous que grunt et grunt-cli sont installés localement dans votre package.json même si grunt vous dit d'installer le cli globalement: $: npm i -S grunt grunt-cli

  2. ajoutez une étape de postinstallation à votre package.json qui ressemble à ceci: "postinstall": "grunt prod"

2
rob

Consultez ce tutoriel: https://medium.com/p/c227cb1ddc56 . Il explique comment vous pouvez déployer une application grunt sur Heroku avec un pack de construction personnalisé.

1
Bruno

Ce message est spécifique à Rails mais je ne vois pas pourquoi vous ne pouvez pas l'utiliser avec un framework back-end et échanger simplement le Ruby buildpack avec tout ce que vous utilisez.

La solution consiste essentiellement à utiliser plusieurs buildpacks et à exécuter le buildpack Node/Grunt grunt build pour vous directement sur Heroku.

De manière significative, cette solution ne vous oblige pas à vérifier les artefacts de génération dans le contrôle de version. (Ouais !!!)

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

0
Jason Swett

L'étape de post-installation de npm est probablement votre meilleure option, car vous pouvez invoquer grunt à partir de là. Mais vous devriez également consulter un buildpack personnalisé, tel que heroku-buildpack-nodejs-grunt .

0
Dan Kohn