13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sails.jsAdvent Calendar 2014

Day 9

Sails.js でファイルの変更を自動検知してサーバを再起動する

Last updated at Posted at 2014-12-09

人生初の Advent Calendar 投稿です。マサカリ耐性は低めなので、ツッコミはやさしくお願いします。

Sails での開発は確認のために毎回サーバを再起動する必要がある

Sails.js に限ったことではないのでしょうが、Node.js 系の開発では Rails の Development モードのようにファイルの変更が即座に反映されません。Sails は View だけは変更が反映されるようですが、Controller や Model はファイルを変更してもサーバを再起動しない限り、変更は反映されません。

SailsCasts を見ていても、変更を加えるたびに手動でサーバを再起動していて、非常にめんどくさそう。

そこで、ファイルの変更を自動検知してサーバを再起動してくれるようにすれば、変更後に即座とは言えないまでも数秒待てば確認できるようになるので、少しは楽になります。

PM2 を使おう

PM2 は Node のプロセスマネージャーで、アプリケーションサーバをデーモン化、落ちてもすぐ再起動するようにしたり、モニタリングを簡単にできるようにしたり、はたまたロードバランシングまでやってくれる高機能なパッケージです。

本番環境で使うことが多いこの PM2 ですが、ファイルの変更を検知してサーバを再起動してくれるオプションがあるので、それを開発環境で使わせてもらおうというのが今回の趣旨となります。

PM2 は NPM パッケージなので、インストールは

$ npm install -g pm2

とするだけ。

使い方

$ pm2 start app.js --watch

をアプリのルートディレクトリで実行してみたのですが、なぜかサーバが延々と再起動を繰り返してしまったため、このやり方は×。

設定の JSON ファイルを用意することで、特定のディレクトリやファイルだけを watch してくれるようになるそうなので、今回はその方法をとります。
config/pm2/development.json というファイルを作成して、その中身を以下のように設定。

{
  "apps": [{
    "name"    : "sample_app",
    "script"  : "app.js",
    "watch"   : ["api", "config"],
    "env": {
      "NODE_ENV": "development",
      "PORT"    : 1337
    }
  }]
}

これで、以下のコマンドで起動すれば、api/ config/ ディレクトリの変更を感知してサーバが再起動され、変更が反映されます。

$ pm2 start config/pm2/development.json

ちなみに views ディレクトリを watch に含めると、サーバが再起動を繰り返すので、先の犯人はこれだった様子。View ファイルはサーバを再起動しなくても変更が反映されるので、watch に入れる必要はありません。

標準出力にログを表示するには、

$ pm2 logs

サーバを終了するには、

$ pm2 kill

を実行します。それ以外の PM2 の詳しい使い方はこちらから。

13
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?