yargs
https://www.npmjs.com/package/yargs
yargs-parser
https://www.npmjs.com/package/yargs-parser
yargsとyargs-parserの違い
yargsがyargs-parserを包括している感じでしょうか?実際の挙動を見てみます。
import yargsp from "yargs-parser";
import yargs from "yargs";
import process from "process";
console.log(yargs(process.argv.slice(2)));
console.log(yargs(process.argv.slice(2)).argv);
console.log(yargsp(process.argv.slice(2)));
$ node app.mjs add --title="Things to buy"
YargsInstance {
customScriptName: false,
parsed: false,
'$0': 'app-chap16.mjs',
argv: [Getter]
}
{ _: [ 'add' ], title: 'Things to buy', '$0': 'app-chap16.mjs' }
{ _: [ 'add' ], title: 'Things to buy' }
- yargsは引数を与えることでYargInstanceというオブジェクトになります。
- yargsの引数パース結果はyargs.argvで参照できます
- yargs-parserはyargsのそれとは若干結果が異なります
- yargsはパース結果に実行ファイルそのものを含むのに対してyargs-parserは明示的に与えた引数のみを結果に含みます
実装例1. yargsを使った基本的なパース
コマンドラインからコマンドをパースさせます。
yargs(process.argv.slice(2))
.usage('Usage: $0 <command> [options]')
.command('count', 'Count the files in a directory', function (yargs) {
console.log('count items!')
})
.command('list', 'list files of a directory:', function (yargs) {
console.log('list items!')
})
.example('$0 count', 'count the lines in the given file')
.help('h')
.alias('h', 'help')
.argv;
以下のコマンドを実行します。想定通りの結果になっているでしょうか?
$ node app.mjs count
count items!
$ node app.mjs list
list items!
$ node app.mjs --help
Usage: app.mjs <command> [options]
Commands:
app.mjs count Count the files in a directory
app.mjs list list files of a directory:
Options:
--version Show version number [boolean]
-h, --help Show help [boolean]
Examples:
app.mjs count count the lines in the given file
実装例2. コマンドオプションの設定
countやlistといったコマンドにオプションを追加してやります。以前はbuilderとしてオプションを与えていたみたいですが・・・。
yargs(process.argv.slice(2))
.usage('Usage: $0 <command> [options]')
.command('count', 'Count the files in a directory', function (yargs) {
return yargs.option('directory', {
alias: 'd',
default: './'
})
console.log('count items!')
})
.command('list', 'list files of a directory:', function (yargs) {
return yargs.option('directory', {
alias: 'd',
default: './'
})
console.log('list items!')
})
.example('$0 count', 'count the lines in the given file')
.help('h')
.alias('h', 'help')
.argv;
以下コマンドを実行してみます。countのみ確認してますが無事オプションは追加されたようです。
$ node app.mjs count --help
app.mjs count
Count the files in a directory
Options:
--version Show version number [boolean]
-h, --help Show help [boolean]
-d, --directory [default: "./"]
しかしながらコマンド実行後の挙動が何もないのは寂しいのでコードを変更して実際の挙動を確認していきます。addコマンドのtitleオプションを指定してコンソール上にタイトルを表示させます。
yargs(process.argv.slice(2))
.usage('Usage: $0 <command> [options]')
.command('add', 'add note',
function (yargs) {
return yargs.option('title', {
alias: 't',
default: '',
demandOption: true})
},
function(argv){
console.log(`Title: ${argv.title}`)
}
)
.example('$0 add --title hoge', 'add title "hoge"')
.help('h')
.alias('h', 'help')
.argv;
以下コマンドを実行していきます。
$ node app.mjs add --help
app.mjs add
add note
Options:
--version Show version number [boolean]
-h, --help Show help [boolean]
-t, --title [required] [default: ""]
$ node app.mjs add --title hoge
Title: hoge
まとめ・所感
- yargsは多機能パーサー、yargs-parserは単機能パーサーといった理解に落ち着くとします