Puis-je dire à foreman de recharger l'application web chaque fois qu'une demande est faite afin que je puisse développer décemment?
Une application web que j'écris en JavaScript en utilisant node.js. J'utilise Foreman, mais je ne veux pas redémarrer manuellement le serveur chaque fois que je change mon code. Puis-je dire à Foreman de recharger l'application Web entière avant de gérer une requête HTTP (c'est-à-dire redémarrer le processus node
)?
6 réponses
Voici une version ajustée de la solution Pendlepants. Contremaître à la recherche d'un .fichier env pour lire les variables d'environnement. Plutôt que d'ajouter un wrapper, vous pouvez simplement demander à Foreman de changer la commande utilisée pour démarrer les choses:
Dans .env:
WEB=node app.js
Dev.env:
WEB=supervisor app.js
Dans votre fichier Procfile:
web: $WEB
Par défaut, Foreman lira de .env (en Production), mais en DEV exécutez simplement ceci:
foreman start -e dev.env
Vous pouvez utiliser réexécuter pour ce but
Vous pouvez implémenter seulement 2 commandes pour ceci:
- gem installer réexécuter
- relancer le début du contremaître
Ensuite, la réexécution redémarrera automatiquement le processus après tout changement dans vos fichiers.
Si vous utilisez nodemon , vous pouvez faire
nodemon --exec "foreman start"
Le problème n'est pas tant avec Foreman que avec la façon dont node ne recharge pas le code sur les nouvelles requêtes. La solution consiste à utiliser un paquet npm comme supervisor avec un wrapper d'environnement pour Foreman.
Tout d'Abord, installez superviseur:
npm install -g supervisor
Ensuite, écrivez un script shell wrapper que Foreman peut appeler:
if [ "$NODE_ENV" == "production" ]; then
node /path/to/app.js
else
supervisor /path/to/app.js
fi
Définissez les autorisations du script wrapper sur exécutable en exécutant chmod a+x /path/to/wrapper_script.sh
Enfin, mettez foreman à jour pour utiliser le script wrapper. Donc, dans votre Procfile
:
web: /path/to/wrapper_script.sh
Maintenant, lorsque vous exécutez Foreman et que votre application node ne fonctionne pas en production, elle doit être rechargée à chaque requête.
J'ai l'impression que le commentaire de Peter Ehrlich sur la question initiale mérite d'être une réponse en soi. Je pense qu'un Procfile différent pour local / dev est certainement la meilleure solution: https://stackoverflow.com/a/10790514/133720
Vous n'avez même pas besoin d'installer quelque chose de nouveau si vous utilisez node-dev.
Votre .fichier env chargé depuis Procfile:
NODECMD=node-dev
Votre Procfile:
web: $NODECMD app/server.js
Votre commande de contremaître
foreman start -e dev.env -p 9786
Et dans votre environnement de production (heroku) définissez une variable d'environnement:
NODECMD=node