【轉載】gulp minimist

Mythsool發表於2018-07-30

今天在看gulp自動化部署相關的文章之時,看到了一個名詞minimist,比較迷惑所以搜尋了一下已做記錄

原文連結:http://jarvys.github.io/2014/06/01/minimist-js/

node.js的命令列引數解析工具有很多,比如:argparse、optimist、yars、commander。optimist和yargs內部使用的解析引擎正是minimist,如果你喜歡輕量級的技術,那麼minimist足夠簡單好用,程式碼量也很少(只有幾百行),非常適合研讀。

minimist的特性比較全面:

  • short options
  • long options
  • Boolean 和 Number型別的自動轉化
  • option alias

先看一下minimist整體的解析過程,程式碼大致是:

for (var i = 0; i < args.length; i++) {
    var arg = args[i];

    if (/^--.+=/.test(arg)) {
        ...
    } else if (/^--no-.+/.test(arg)) {
        ...
    } else if (/^--.+/.test(arg)) {
        ...
    } else if (/^-[^-]+/.test(arg)) {
        ...
    } else {
        ...
    }
}

解析過程中,minimist會依次匹配不同的模式,從long options到short options,匹配之後再進行相應的解析工作。

我們可以寫一個簡單地例子來試試minimist:

// test.js
var args = require('minimist')(process.argv.slice(2));

console.log(args.hello);
$ node test.js --hello=world
// world
$ node test.js --hello world
// world
$ node test.js --hello
// true 注意:不是空字串而是true

從上面的例子可以看到,minimist和optimist一樣會把引數解析成一個字典。但是最後一次的值與前兩次不太一樣。去掉world之後,hello的值變成了true一般情況下,如果引數後面沒有跟著的value的話,minimist會把引數的值解析成true。不過,minimist在解析介面當中提供的string選項來修改上面的解析過程。string選項可以傳入一個陣列,陣列中的引數會被一直解析成字串。我們修改一下上面的test.js

var args = require('minimist')(process.argv.slice(2), {
    string: ["hello"]
});

console.log(args.hello);
$ node test.js --hello world
// world
$ node test.js --hello
// ""

string選項當中新增了hello之後,hello的值會一直解析成字串,如果去掉了world,那麼hello將解析成空字串。

minimist還支援boolean選項,與string選項相反,在boolean選項當中的引數,會被一直解析成truefalse,比如下面的例子:

var args = require('minimist')(process.argv.slice(2), {
    boolean: ["hello"]
});

console.log(args.hello);
console.log(args._);
$ node test.js --hello world
// true
// [ 'world' ]
$ node test.js
// false
// []

hello將一直被解析成truefalse,新增的world會儲存到args_選項裡面。

除了stringboolean以外,minimist還提供了defaultalias兩個選項,分別用來設定預設值和option alias。