gruntから徐々にgulpを使っていきたい時など
gulpでないと面倒な事象に行き当たり、どうしてもgruntからgulpに
乗り換える必要がでてきた。
しかしgruntファイルが肥大化しているので、全部書き換えるのも面倒だ。
最初はGruntfileの他にgulpfileも用意して併用すればいいかと考えたが、
gruntのタスクABCとgulpのタスクXYZを一緒に使いたかった。
この場合
- grunt内でgulpを呼び出す
- gulp内でgruntを呼び出す
の2択があるが、既存のフローがgruntだという理由で今回は1を選択。
grunt内でgulpを呼び出す
gulpfile側は
gulp = require 'gulp'
gulp.task 'ABC', ->
# do something
module.exports = gulp # ここだけ追加!
Gruntfile側は
require('coffee-script/register') # 最新のCoffeeScript使いたい
module.exports = (grunt) ->
grunt.registerTask 'gulp-ABC', ->
require('./gulpfile').start('ABC', @async())
grunt.registerTask 'ABC-XYZ', ['gulp-ABC', 'XYZ'] # XYZはどこかに定義されてる別タスク
もちろん.coffeeでなく.jsでもいい。
解説
gulpはgulp.start()
で呼び出せるので、requireした後それを呼んであげればよい。
requireできるようにexportsすればそれでOK。
@async()
は、gruntタスク終了時のコールバック関数を返すもの。
これをgulp.start()の最後の引数に渡すと、gulpタスク終了時にこの関数が実行されてうまい具合にいく。
require('coffee-script/register')
は、
CoffeeScriptでGruntfileを書いてるとき限定の話で、そうでなければ無視していただいてOKだが、
小話として聞いてほしい。
gruntのcoffeescriptが古すぎる問題というのがあって、これのせいで、
gulp.src './xxx'
.pipe yyy()
このメソッドチェーンができない。
なのでgruntコマンドからrequire('./gulpfile')
したときのrequireを、
新しいCoffeeScriptのrequireにしてあげないといけない、という理由で
require('coffee-script/register')
と書いた。
ログを出す
ログを出す部分のコードはgulpの bin/gulp.js
に書かれているので、上記の方法だと厳しい。
それはしょうがないとしよう。