これ便利!gulpfile.js でLinuxコマンドを記述して実行できるプラグインgulp-exec と child_processを使ってみた


gulp-exec_03

gulpはVagrant上のCentoOSやUbuntuと組み合わせて使うことが多いのですが、やりたいタスクのプラグインを探して組み込むよりも直接Linuxコマンドを書いて実行できたら楽で幅が広がるのではないかと思って調べました。その備忘録です。

gulp-exec と child_process の違い

gulp-exec も child_process も直接 gulpfile.js にLinuxコマンドを記述できるのですが、gulp-execは「gulp.src('./**/**')」が必要であり、対象となるファイルを指定してコマンドを実行するのに対し、child_process は単にコマンドを実行したい場合に使うようです。
gulp-exec のgulp-exec 公式にも以下のような記載がありました。

Note: If you just want to run a command, just run the command, don't use this plugin:
var exec = require('child_process').exec;

gulp-exec GitHubで gulp-exec のコードをみてみると child_process を使っているのでファイルを絡んだ複雑な処理を簡単にできるようにしたのが gulp-exec みたいです。

gulp-exec のインストール

gulp-execは npmパッケージになってますので、npm install でインストールできます。

npm install gulp-exec

child_process のインストール

child_processは npmパッケージになってますので、npm install でインストールできます。
ただ、child_processは別にインストールしなくてもNode.js標準で使えるようになっているようです。

npm install child_process

child_process を使ってコマンドを実行する

かんたんなサンプルです。

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

gulp.task('child_process_sample', function() {
  var command = "pwd";
  ps(command , function (err, stdout, stderr) {
    console.log(stdout);
  });
});
[vagrant@localhost vagrant]$ gulp child_process_sample
[05:07:44] Using gulpfile /vagrant/gulpfile.js
[05:07:44] Starting 'child_process_sample'...
[05:07:44] Finished 'child_process_sample' after 5.42 ms
/vagrant

[vagrant@localhost vagrant]$

pwdコマンドを実行して、標準出力sdoutをコールバックで受け取りコンソールに出力しています。今回はカレントが /vagrant なので /vagrant と出力されました。

child_process.exec の詳しい使い方は Node.js公式>child_process.exec が参考になります。

gulp-exec_01

gulp-exec を使ってコマンドを実行する

かんたんなサンプルです。

var gulp = require('gulp');
var exec = require('gulp-exec');

gulp.task('gulp_exec_sample', function() {
  var options = {
    continueOnError: false, pipeStdout: false ,
    customTemplatingThing: "pwd" };
  var reportOptions = {err: false, stderr: true, stdout: true}

  var command = 'echo <%= file.path %>;'
              + '<%= options.customTemplatingThing %>';
  gulp.src('./*.js')
    .pipe(exec(command , options))
    .pipe(exec.reporter(reportOptions));
});
[vagrant@localhost vagrant]$ gulp gulp_exec_sample
[05:28:20] Using gulpfile /vagrant/gulpfile.js
[05:28:20] Starting 'gulp_exec_sample'...
[05:28:20] Finished 'gulp_exec_sample' after 6.44 ms
[05:28:20] /vagrant/gulpfile.js
/vagrant
[vagrant@localhost vagrant]$

gulp.src('./*.js') の指定で該当するファイルパスを file.path で受け取り echoコマンドを実行しています。オプション customTemplatingThing で pwd コマンドを指定しました。コマンド文字列で<%= options.customTemplatingThing %>を記述しておけば、指定した「pwd」に置き換えて実行してくれます。

今回はgulp.src('./*.js')で該当するファイルパスが/vagrant/gulpfile.js しかなかったので、実行されたコマンドは以下になります。

echo '/vagrant/gulpfile.js';pwd

reportOptions で 標準エラー stderr: true, 標準出力 stdout: true を指定していますが、ここをtrueにしておかないとコンソールに出力されませんでした。
また、continueOnErrorでpipeStdout: true にしてしまうと、gulp.src('./*.js')に該当するファイルの中身がコマンド出力内容で上書きされてしまうので注意が必要です。

gulp-exec の詳しい使い方は npm > gulp-exc が参考になります。
gulp-exec_02

以上より、gulp-exec とchild_process である程度すきなようにLinuxコマンドを実行できるのではないかと思います


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です