これからはじめるGulp #20:Node.jsのChild Processモジュールを使ってgulpからjekyllのbuildコマンドを実行する

2014.12.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回のこれからはじめるGulp(19):gulp-sketchとgulp-execを使ったSketch 3デザインデータの画像書き出しでSketch3のデザインデータからスライスを書き出す方法についていくつかの方法を紹介しました。今回はNode.jsのChild Processを使ってgulpからjekyllのbuildコマンドを実行してみたいと思います。

jekyllについて

jekyllはRuby環境で静的なサイト・ブログを作ることができるジェネレータです。今回、インストールやテンプレートの構築については説明を省きます。このシリーズを最初から読んでいる方はGemfileにgem "jekyll"を追記して$ bundle installを実行してください。普通のRuby環境にインストールしたい場合はこちらのInstallationのページを参考にしてください。この記事ではjekyllが動く前提で説明していきます。

Node.jsのChild Processモジュール

Child Processは完全にノンブロッキングな方法で子プロセスの stdin、stdout、 そして stderr を通じたデータストリームを実現します。

Child Processモジュールのexecメソッドを使うことでシェルを実行します。このメソッドを使うことでjekyllコマンドを実行します。

モジュールを読み込む

execメソッドはインストールせずに利用できます。この方法はgulp-execプラグインを参考にしました。

var exec        = require('child_process').exec;

タスクを作る

jekyllコマンドのオプションを管理するためにgulp-utilのtemplateメソッドを使います。サブコマンドとコマンドを変数jekyllOptionsで管理し、templateメソッドを使って当て込みます。jekyllのコマンドオプションはこちらに載っています。

var gulp        = require('gulp');
var gutil       = require('gulp-util');
var exec        = require('child_process').exec;

gulp.task('jekyll:build', function (cb) {

  var jekyllOptions = {
    subCommand  : 'build',
    configFiles : './config.yaml'
  };

  var jekyllCommand = 'jekyll <%= options.subCommand %> --config <%= options.configFiles %>';
  var command       = gutil.template(jekyllCommand, {file: null, options: jekyllOptions});

  exec(command, function (err, stdout, stderr) {
    console.log(stdout);
    console.log(stderr);
    cb(err);
  });
})

jekyll:buildタスクを実行する

jekyll:buildタスクを実行して実際にこのブログをビルドしてみます。

$ gulp jekyll:build
[15:04:25] Using gulpfile ~/Projects/gulp.whiskers.nukos.kitchen/gulpfile.js
[15:04:25] Starting 'jekyll:build'...
Configuration file: ./_jekyll/config.yml
            Source: ./src
       Destination: ./prv
      Generating...
                    done.
 Auto-regeneration: disabled. Use --watch to enable.
[15:04:33] Finished 'jekyll:build' after 7.71 s

60本程度の記事を7.71sでビルドできました。watchやserveについても同じ方法で実行可能です。ファイルの監視についてはまだ未検証なので今度試して紹介したいと思います。明日はgulp-s3プラグインを使ってAWS S3の静的サイトホスティング機能にデプロイしてみたいと思います。

この記事はこれからはじめるGulp(20):Node.jsのChild Processモジュールを使ってgulpからjekyllのbuildコマンドを実行するの転載です。