2014年2月15日土曜日

yo backboneでアプリ作成した時のgrunt testタスクのバグ??

Yoemanのgenerator-backboneでアプリの雛型を作成すると、
デフォルトでは
$ grunt test
を実行した後に、watch:testタスクで監視しているファイルを編集and保存すると
以下のエラーを吐いてテストが実行されません・・・(僕の環境だけかもしれませんが)

Running "compass:dist" (compass) task
directory .tmp/styles/
   create .tmp/styles/main.css (2.475s)
Compilation took 2.477s

Running "compass:server" (compass) task
unchanged app/styles/main.scss
Compilation took 0.198s

Running "connect:test" (connect) task
Fatal error: Port 9001 is already in use by another process.


どうやら9001番ポートでムダに待とうとしているようです。
現象としてはこんな感じかと。

grunt test 実行!!!
  clean:server
  coffee
  createDefaultTemplate
  jst
  compass
  connect:test // 9001ポートで待つ! ... A
  mocha
  watch:test // ファイルの監視

  !!!ファイルを編集and保存!!!
  clean:server
  coffee
  createDefaultTemplate
  jst
  compass
  connect:test // Aですでに9001を使用してるのでこける


ということでGruntfile.jsを2箇所修正します。

1箇所目 (watchタスクのtestターゲット)
watch: {
  ...
  test: {
    files: ['<%= yeoman.app %>/scripts/{,*/}*.js', 'test/spec/**/*.js'],
    tasks: ['test:watch'] // ここ! test -> test:watchへ
  }
}
2箇所目 (testタスクを登録しているところ)
grunt.registerTask('test', function(target) {
  var tasks = ['clean:server', 'coffee', 'createDefaultTemplate', 'jst', 'compass'];
  if (target !== 'watch') {
    // watchタスクから呼ばれた場合はなにもしない。
    // それ以外は9001で待つ!
    tasks.push('connect:test');
  }

  tasks.push('mocha');

  if (target !== 'watch') {
    // watchタスクから呼ばれた場合はなにもしない。
    // それ以外はwatchタスクを実行する
    tasks.push('watch:test');
  }
  grunt.task.run(tasks);
});