16874


gulp+webpackでcoffeescriptをjavascriptへ変換する際にcoffeeの書式エラー等でビルドに失敗した時にgulp-
notify等で通知を出したいのですが、gulpの`.on('error', function(){})`でエラーを取得できません。

必要最低限の`gulpfile.coffee`を以下のように記述してみたのですが、coffee/common.coffeeへ`if a? b ::
c`のようなエラーを起こすコードを入れてビルドしてもターミナルへcoffee-lint-loaderの出力がでるだけで`[webpack] build
error!`が出力されないようです。  
webpackのコールバック関数でチェックもしたのですが、最終的なerrの内容がcommon.coffeeのビルド結果に関係なく`null`になっているようです。

webpack内のNormalModules.jsのdoBuild()内ではerrの内容が格納されているのでスタックトレースを追いかけてみたのですが、errの内容が`null`になる理由がわかりませんでした。  
loader側のエラーの場合にエラーハンドリングができない原因は分かりますでしょうか。

### gulpfile.coffee

[code]

    gulp    = require 'gulp'
    gutil   = require 'gulp-util'
    webpack = require 'webpack-stream'
    
    dest = './build'
    src  = './coffee'
    
    config =
      entry:
        common: src + '/common.coffee'
      output:
        filename: '[name].js'
      resolve:
        modulesDirectories: [ 'node_modules' ]
        extensions: [ "", ".js", ".coffee", ".webpack.js", ".web.js" ]
      module:
        loaders: [
          { test: /\.coffee$/, loader: "coffee-loader" }
        ]
        preLoaders: [
          { test: /\.coffee$/, loader: "coffee-lint-loader" }
        ]
    
    gulp.task 'coffee', ->
      gulp.src src
        .pipe webpack config
        .on 'error', ->
          gutil.log '[webpack] build error!'
        .pipe gulp.dest dest
    
[/code]

参考までにテストした環境はnode.js v4.0.0に以下のnpmパッケージを入れた物となっています。

[code]

      "dependencies": {
        "coffee-lint-loader": "0.0.1",
        "coffee-loader": "^0.7.2",
        "coffee-script": "^1.10.0",
        "gulp": "^3.9.0",
        "gulp-util": "^3.0.6",
        "webpack-stream": "^2.1.0"
      }
    
[/code]

* * *

## 解決方法

`webpack-
stream`をパイプラインで実行する際に第3引数へコールバック関数を設定し、`stats`からerrorsを取得する事でloadersのエラー内容を確認することが出来ました。

このerrorsの内容の取得方法が2種類あるようです。  
一つは公式サイトの例に載っている`stats.toJson().errors`を使った方法、もう一つは`stats.compilation.errors`から変換前のログを取得する方法となります。

以下は公式サイトの`toJson()`を利用した簡単な例になります。

[code]

    gulp.task 'coffee', ->
      gulp.src src
        .pipe webpack config, null, (error, stats) ->
          for err in stats.toJson().errors
            gutil.log '[webpack] ' + err.toString()
        .pipe gulp.dest dest
    
[/code]

参考までに今回の解決方法を元に`gulp-notify`に対応させたタスクがこんな感じになりました。  
ログのフォーマット修正等を行いたかったので`stats.compilation.errors`を元にゴチャゴチャと処理してます。  
<https://gist.github.com/sasrai/b38fbcaa0ad2bb53542c>


CC BY-SA 3.0
2015-09-22T18:56:08.323
16856
2015-09-27T19:36:06.790
2015-09-27T19:36:06.790
12404
12404
question
javascript node.js gulp
gulp+webpack-stream+coffee-loaderでcoffeescriptのエラーをハンドリングできません。


実際に出たエラーログの内容はありますか？`error`イベントで拾えない場合、[process.on('uncaughtException')など](https://nodejs.org/api/process.html#process_event_uncaughtexception)で例外を受信している可能性があります。つまるところ、使用しているモジュールが想定していない箇所で、エラーが発生しているのではないでしょうか？


CC BY-SA 3.0
2015-09-23T08:24:19.320
16874
2015-09-23T08:24:19.320
9834
16856
answer