Gruntfile更新したらgruntコマンドをリスタート

もっと賢いやり方がありそうですが

##やりたいこと

- `Gruntfile`を修正する度に`grunt`コマンド止めて`grunt`とやってるのが面倒になってきた
- `node-dev app.js`みたいなのを`grunt`コマンドでもやりたい

##やりかた

- `node-dev`や`nodemon`に`grunt`コマンドファイル（中身はjs）のパスを渡せばOK
- `which grunt`の戻り値を渡せばOK

##例

- `nodemon`使う
- ここで使ってる`Gruntfile.coffee`の抜粋

```
  grunt.loadNpmTasks "grunt-koko"
  grunt.loadNpmTasks "grunt-contrib-jade"
  grunt.loadNpmTasks "grunt-contrib-coffee"
  grunt.loadNpmTasks "grunt-contrib-watch"
  grunt.loadNpmTasks "grunt-contrib-uglify"
  grunt.loadNpmTasks "grunt-contrib-concat"
  grunt.loadNpmTasks "grunt-contrib-clean"
  grunt.loadNpmTasks "grunt-contrib-connect"
  grunt.loadNpmTasks "grunt-contrib-cssmin"
  # resigster
  grunt.registerTask "default", [ "connect","watch"]
```

###`nodemon`

- `Gruntfile`のあるディレクトリで以下の`nodemon`コマンド実行

```
nodemon "$(which grunt)"
```
- `"$(which grunt)"`の部分は展開されて、次のように実行したのと同じになる

```
nodemon $HOME/nvm/v0.10.2/lib/node_modules/grunt-cli/bin/grunt`
```

- 自分のは`nvm`使ってて、ver.が少し古い`v0.10.2`使ってるからこんな風なパスになる

一応動きこんな感じにterminalに出力される

```
$ nodemon /Users/akymrk/nvm/v0.10.2/lib/node_modules/grunt-cli/bin/grunt
20 Sep 18:47:27 - [nodemon] v0.7.10
20 Sep 18:47:27 - [nodemon] to restart at any time, enter `rs`
20 Sep 18:47:27 - [nodemon] watching: /Users/akymrk/sample
20 Sep 18:47:27 - [nodemon] starting `node /Users/akymrk/nvm/v0.10.2/lib/node_modules/grunt-cli/bin/grunt`
Running "connect:livereload" (connect) task
Started connect web server on localhost:9001.

Running "watch" task
Waiting...20 Sep 18:48:11 - [nodemon] restarting due to changes...
20 Sep 18:48:11 - [nodemon] /Users/akymrk/sample/Gruntfile.coffee


20 Sep 18:48:11 - [nodemon] starting `node /Users/akymrk/nvm/v0.10.2/lib/node_modules/grunt-cli/bin/grunt`
Running "connect:livereload" (connect) task
Started connect web server on localhost:9001.

Running "watch" task
Waiting...20 Sep 18:49:07 - [nodemon] restarting due to changes...
20 Sep 18:49:07 - [nodemon] /Users/akymrk/sample/Gruntfile.coffee


20 Sep 18:49:07 - [nodemon] starting `node /Users/akymrk/nvm/v0.10.2/lib/node_modules/grunt-cli/bin/grunt`
Running "connect:livereload" (connect) task
Started connect web server on localhost:9002.

Running "watch" task
Waiting...20 Sep 18:49:13 - [nodemon] restarting due to changes...
20 Sep 18:49:13 - [nodemon] /Users/akymrk/sample/Gruntfile.coffee
```

- `nodemon`は`Gruntfile.coffee`の修正を検知すると、`grunt`コマンドを停止・再開してくれる

##`nodemon`が更新を監視してるファイル

- カレントディレクトリの`.js`ファイルと`.coffee`ファイル
  - `Gruntfile.coffee`以外にも`.js`、`.coffee`がカレントディレクトリにあれば、そのファイルの更新も再起動のトリガーになる
  - これがデフォルト実行時の監視対象
  - 同じディレクトリに普通置かれてる`package.json`の更新は検知しない

##`package.json`が更新されたときも'nodemon'使ってリスタートしたい

- 使ってるプラグインのアップデートして `npm`の`--save-dev`して`package.json`が更新されたときとか
- `Gruntfile.js`でのみ有効
- `Gruntfile.coffee`だとNG
- `nodemon`の`-e`オプションで監視するカレントディレクトリのファイル拡張子を渡す
```
nodemon -e js,json "$(which grunt)"
```

##`nodemon`使うと`grunt`のlivereloadが正常に動かない

- `.coffee`ファイル修正したときは、動かず、`.css`や`.jade`編集したときは動いた
- `.nodemonignore`ファイルに、nodemonによる監視を無視するファイル、ディレクトリを書いたらOKだった

```
# .nodemonignoreの例
/css/*
/jade/*
/coffee/*
/js/*
.git/*
```

##`grunt dev`とかオプション渡したいとき

`nodemon "$(which grunt)"  dev`という風に足せば動いた

##`node-dev`でもやり方同じ

```
node-dev  "$(which grunt)" default
```