シンプルなタスクでgulpの特徴を理解
ここではシンプルなタスクを実行させるサンプルでgulpの利用法と特徴を説明します。
はじめてのgulpタスク
最初にgulpで単一のタスクを実行させます(このサンプルはサンプルコード内のHello_gulp_1フォルダに含まれています)。まず任意のフォルダを作成してリスト2のコマンドを入力し、gulpを使えるようにします。ここでインストールしたgulpは実際のタスク処理に利用されます。
npm install --save-dev gulp
なお、サンプルファイルをそのまま利用する場合は、パッケージファイル(package.json)にgulpを定義済みなので「npm install」コマンドでgulpをインストールできます。
次にgulpの設定ファイルgulpfile.jsをリスト3のように作成します。
// gulpの指定 ...(1) var gulp = require("gulp"); // defaultタスクの定義 ...(2) gulp.task("default", function() { console.log("first gulp task"); });
(1)でgulpのオブジェクトを変数gulpに生成し、(2)でdefaultタスクを生成しています。コンソールに文字列を出力するだけのタスクです。
準備ができたらコマンドプロンプトでgulpコマンドを実行します。
gulp
リスト4のコマンドにより、リスト1でシステム自体にインストールされたgulpがコマンドラインツールとして実行され、リスト2でフォルダにインストールされたgulpを呼び出して実際のタスク処理を行います。
リスト4のように引数なしでgulpコマンドを実行するとdefaultタスクが実行されます。その結果、図2のようにコンソールに文字列が出力されます。
なお「gulp <タスク名>」と引数にタスク名を指定することで、実行するタスクを明示的に指定できます。
タスクの並列実行
次にタスクの並列実行を試します(このサンプルはサンプルコード内のHello_gulp_2フォルダに含まれています)。gulpfile.jsをリスト5に示します。
// gulpの指定 ...(1) var gulp = require("gulp"); // defaultタスクの定義 ...(2) gulp.task("default", ["task1", "task2"]); // task1タスク ...(3) gulp.task("task1", function() { setTimeout(function(){ console.log("task1 executed with delay."); }, 1000); }); // task2タスク ...(4) gulp.task("task2", function() { console.log("task2 executed."); });
(2)のようにtaskメソッドの第2引数にタスク名の配列を指定すると、それらのタスクが並列に実行されます。ここでは(3)のtask1タスクと(4)のtask2タスクが実行されますが、task1タスクはsetTimeoutによりタスク完了が1秒遅延します。
リスト5のgulpfile.jsを配置してgulpを実行すると、task1タスクとtask2タスクが並列実行されます。task2タスクはtask1タスクの完了を待たず並列実行されるため、図3のようにtask2のコンソール出力が先に行われます。
このようにgulpでは特に意識しなくてもタスクが並列実行されるため、タスク完了待ちによる実行時間の増加を最低限に抑えられます。
タスクを順番に実行するには
gulpではタスクを並列化せず順番に実行することもできます(このサンプルはサンプルコード内のHello_gulp_3に含まれています)。task2タスクの実行をtask1タスク完了後に行いたい場合はリスト6のようにします。
// gulpの指定 ...(1) var gulp = require("gulp"); // defaultタスクの定義 ...(2) gulp.task("default", ["task2"]); // task1タスク ...(3) gulp.task("task1", function(callback) { setTimeout(function(){ console.log("task1 executed with delay."); callback(); }, 1000); }); // task2タスク ...(4) gulp.task("task2", ["task1"], function() { console.log("task2 executed."); });
task2タスク(4)で第2引数の["task1"]という記述は、自身より先にtask1タスクを実行するという依存依存を表します。またtask1タスク(3)ではタスク完了時に実行するコールバック関数callbackを記述することで、後続する依存タスク(=task2タスク)の実行を待たせることができます。defaultタスク(2)ではtask2のみを実行するように記述しますが、(4)の依存関係によりtask1タスクが先に実行されるようになります。
リスト6のタスクを実行すると、task1タスク→task2タスクの順で実行されてコンソール出力が行われるようになります。