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 で十分だろう。