node expressサーバーの起動をgruntから行う


node+express環境ではnode appでサーバー起動をする方法はdeprecatedで最近はnpm startコマンドが推奨されているみたいです。

npm startを発行するとpackage.jsonの中のscriptsに記載されたコマンドが発行され、通常express環境なら/bin/wwwというスクリプトが叩かれます。

package.json

  "scripts": {
    "start": "node ./bin/www"
  },

wwwもjavascriptファイルで、中ではapp.jsを特定のポートに対してlistenしているだけです。

ただ、もしサーバーの起動をgruntに任せたい場合はどうしましょう。

私の場合は開発時にgruntタスクでbowerの依存ライブラリインストールから、requirejsのビルド、さらにはwatchタスクまで行ってしまいたいので、npm startで起動するのではなくgruntで起動できると、とても便利になります。

gruntのexpress用のプラグインがあるみたいなのですが、ただnpm startを実行したいだけなのであまり使用したくない。そのように単にコマンドを一行gruntのタスクの中で発行したいような場合はgrunt-shellというgruntでshellコマンドを実行できるツールを使うのが、お手軽かつ応用も効きそうなのでよいかと思います。(grunt-execというのもあるみたいです。)

使用方法はかなり簡単で、まずはgrunt-shellをインストール

npm install --save-dev grunt-shell

Gruntfile.js内に以下のエントリを追加する。

    grunt.initConfig({
        shell: {
            start: {
                command: 'npm start'
            }
        },

defaultのタスクのbower installやrequirejsのビルド後にサーバーを起動させる場合は以下のようにタスクを列挙します。

    grunt.registerTask('default', [
        'bower:install',
        'jshint',
        'requirejs:dev',
        'shell:start',
        'watch'
    ]);

これで、gruntというコマンド一発で、依存ライブラリインストール + jshint + AMD jsビルド + サーバー起動 + watch全てができるようになりました。便利!