gulp+webpack-stream+coffee-loaderでcoffeescriptのエラーをハンドリングできません。
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
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
参考までにテストした環境はnode.js v4.0.0に以下のnpmパッケージを入れた物となっています。
"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"
}
解決方法
webpack-stream
をパイプラインで実行する際に第3引数へコールバック関数を設定し、stats
からerrorsを取得する事でloadersのエラー内容を確認することが出来ました。
このerrorsの内容の取得方法が2種類あるようです。
一つは公式サイトの例に載っているstats.toJson().errors
を使った方法、もう一つはstats.compilation.errors
から変換前のログを取得する方法となります。
以下は公式サイトのtoJson()
を利用した簡単な例になります。
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
参考までに今回の解決方法を元にgulp-notify
に対応させたタスクがこんな感じになりました。
ログのフォーマット修正等を行いたかったのでstats.compilation.errors
を元にゴチャゴチャと処理してます。
https://gist.github.com/sasrai/b38fbcaa0ad2bb53542c