モードの変更

yargsを使ってタスクランナーのコマンドにオプションを渡す

Node.js

Grunt や gulp を使っていると、タスクにオプションを渡して処理を分岐したい欲求が出てくる。そういう時はyargsを使えば、オプションをタスクランナー側に渡せる。

npm install --save-dev yargs したのち、タスクを書いてる JS ファイル(Gruntfile.js とか gulpfile.js とか)で yargs を require する。

var yargs = require("yargs").argv;

そしてタスクの実行に下記のようなオプションを渡す。

gulp sass --device=pc

すると、タスクを書いてる JS 内で yargs にキーと値がオブジェクトで格納されるので、次の按配で取得できる。

yargs.device; // → "pc"

便利。

オプションは複数渡せる。試しに以下のようなタスクを書いて実行してみる。

gulp.task("test", function () {
  console.log(yargs);
});
gulp test --name=oti --male --female=false --"rain bringer" --note="oti is not real name."

結果は下記の通り。

[11:34:21] Using gulpfile ~/develop/mbrs/test-yargs/gulpfile.js
[11:34:21] Starting "test"...
{
  _: [ "test" ],
  name: "oti",
  male: true,
  female: "false",
  "rain bringer": true,
  note: "oti is not real name.",
  "$0": "/Users/tkg/.nodebrew/current/bin/gulp"
}
[11:34:21] Finished "conslog" after 1.83 ms

値を指定せずにつけた --male は真偽値の true となる。

値を指定すると全て文字列型になる。なので、--female=false としても真偽値の false にはならず文字列の "false" となる。ここは注意が必要だ。

--"rain bringer" のようにスペース込みのキーにしたい場合はオプション記述時にクオーテーションをつければ良い。

_ にタスク名、"$0" に gulp の元ファイルのディレクトリも格納されるようだ。

gulp での具体的な例

もうちょっと具体的な例にすると以下のようなこんな感じだ。このサンプルでは PC と SP とで完全にディレクトリを分けてソースを管理している。

"use strict";

// load plugins
var gulp = require("gulp");
var sass = require("gulp-sass");
var autoprefix = require("gulp-autoprefixer");
var yargs = require("yargs").argv;

// config
var config = {
  pc: {
    src: "./src/pc/",
    dest: "./dist/pc/",
    browsers: ["last 2 versions", "ie > 7"]
  },
  sp: {
    src: "./src/sp/",
    dest: "./dist/sp/",
    browsers: ["last 3 versions", "android > 1"]
  }
};

// Sass
gulp.task("sass", function() {
  return gulp.src(config[yargs.device].src + "sass/*.scss")
    .pipe(sass({
      outputStyle: "compressed"
    }))
    .pipe(autoprefix({
      browsers: config[yargs.device].browsers,
      cascade: false
    })
    .pipe(gulp.dest(config[yargs.device].dest + "css"));
});

で、下記オプションをつけてタスクを実行する。

gulp sass --device=pc

これで PC 用の sass ファイルをコンパイルして、PC 向けの autoprefixer に通して、PC 用のディレクトリに出力できる。SP 用ならオプションを --device=sp とすればよい。

簡単に使う分には yargs で十分だろう。