node.jsを使用してJavaScriptで作成しているWebアプリ。Foremanを使用していますが、コードを変更するたびにサーバーを手動で再起動したくありません。node
HTTPリクエストを処理する前に(つまり、プロセスを再開する前に)Webアプリ全体をリロードするようにForemanに指示できますか?
6 に答える
Pendlepants ソリューションの調整バージョンを次に示します。Foreman は、環境変数を読み取るために .env ファイルを探します。ラッパーを追加するのではなく、Foreman が起動に使用するコマンドを切り替えるだけです。
.env:
WEB=node app.js
dev.env:
WEB=supervisor app.js
あなたのプロファイルで:
web: $WEB
デフォルトでは、Foreman は .env (本番環境) から読み込みますが、DEV ではこれを実行するだけです:
foreman start -e dev.env
この目的のために再実行を使用できます
これには 2 つのコマンドだけを実装できます。
- gem インストールの再実行
- フォアマンスタートを再実行する
その後、再実行すると、ファイルが変更された後にプロセスが自動的に再起動されます。
nodemonを使用すると 、次のことができます
nodemon --exec "foreman start"
問題は Foreman ではなく、ノードが新しいリクエストでコードをリロードしない方法にあります。解決策は、スーパーバイザーのような npm パッケージを Foreman の環境ラッパーと共に使用することです。
まず、スーパーバイザーをインストールします。
npm install -g supervisor
次に、Foreman が呼び出すことができるラッパー シェル スクリプトを作成します。
if [ "$NODE_ENV" == "production" ]; then
node /path/to/app.js
else
supervisor /path/to/app.js
fi
実行して、ラッパースクリプトのアクセス許可を実行可能に設定しますchmod a+x /path/to/wrapper_script.sh
最後に、ラッパー スクリプトを使用するように foreman を更新します。だからあなたのProcfile
:
web: /path/to/wrapper_script.sh
これで、Foreman を実行し、ノード アプリが運用環境で実行されていない場合、要求ごとに再読み込みする必要があります。
元の質問に対するPeter Ehrlichのコメントは、それ自体が答えになるに値すると思います。local/dev 用の別の Procfile が間違いなく最適なソリューションだと思います: https://stackoverflow.com/a/10790514/133720