コマンドライン引数の覚書
コマンドラインって便利だけど、自分で作るとやっぱり面倒な事も多いですよね。
今回は、コマンドラインツールを作ると高確率で起きる面倒毎のメモを残しておこうと思います。
引数の処理は地味に面倒
毎度ツールを作る時に地味に面倒なのはコマンドライン引数を受ける時の処理です。
使い捨てのツールの場合は、process.argv[]を直接使うか、パラメータになる部分をハードコードしてしまえばいいんですが…。
今後も使うものは、使い方忘れる場合もあり、引数を調べるためにソースを読みたくないのでヘルプもしっかりしておきたいんですがこれが地味に面倒です。
面倒を解決するためのコマンドライン引数のパーサーのはずが…
コマンドライン引数の処理を簡略化したくて、ライブラリを使う事にしました。
調べた感じ、yargsというライブラリが人気の様なので今回はyargsを使用するようにしました。
そして、今回もしっかりハマりました。
コマンドライン引数に名前を付けられるのですが、引数名が上手く使用できない。
沢山転がっている位置引数(?)を使用したサンプルの例
const argv = yargs(hideBin(process.argv))
.positional('imagePath', { ... })
.positional('isClip', { ... })
.demandCommand(1)
.argv;
// 使用サンプル
somthingFunc(argv._[0], argv._[1]);
positional('imagePath',...)やpositional('isClip',...)で引数名付けているんだから
imagePathやisClipの名前を使ってやり取りしたいわけです。
こんな感じです。
somthingFunc(argv.imagePath, argv.isClip);
結局、面倒事はライブラリで楽をする予定でしたが余り楽は出来なかったです。
結論
色々試行錯誤して分かったことは、.command()を定義しないと引数の名前は使用できない様です。
内部処理を見てないので分からないですが、使う側としてpositionalの設定で使用方法定義しているのでそこはいい感じにして欲しかった。
ということで、以下が名前を使って動作する書き方になります。
const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers');
// コマンドライン引数の処理
const argv = yargs(hideBin(process.argv))
.command('* <imagePath> [isClip]')
.positional('imagePath', {
describe: '画像パスを指定してください',
demandOption: true,
type: 'string',
})
.positional('isClip', {
describe: 'クリップを行うか',
type: 'boolean',
default: true,
})
.demandCommand(1)
.argv;
// 使用サンプル
somthingFunc(argv.imagePath, argv.isClip);