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?
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:
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 .
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.
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
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.
Heroku buildpack fonctionne très bien pour moi. Super truc.
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 .
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
ajoutez une étape de postinstallation à votre package.json qui ressemble à ceci: "postinstall": "grunt prod"
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é.
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/
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 .