Node.jsコマンドライン引数パーサーライブラリyargsの使い方

yargsとは

Node.js用のコマンドライン引数パーサーライブラリです。

Node.jsで引数を取得するには以下のように書きますが、引数がたくさんある場合や、「node example.js --age=35」のように指定したい場合には不向きです。

const args = process.argv.slice(2)
console.log(args)
// node example.js aaa bbb
// [ 'aaa', 'bbb' ]

そんなときはyargsをインストールして使うと引数に名前と値を指定できて便利です。

yargsの使い方

まず「npm i yargs」でyargsをインストールします。

npm i yargs

次にJavaScriptでyargsを読み込んで、以下のように引数を取得します。

const yargs = require('yargs/yargs')
const argv = yargs(process.argv.slice(2)).help().argv

console.log(`Hello, ${argv.name}! ${argv.age} years old.`)

あとはターミナルでNode.jsを実行すれば引数を取得した結果を表示できます。

node example.js --name=Kenji --age=35
Hello, Kenji! 35 years old.

yargsの引数を必須にする設定

前述の例の場合、引数を指定し忘れると該当の引数部分がundefinedで返ります。

node example.js --name=Kenji
Hello, Kenji! undefined years old.

これを防ぐにはyargsのoptionで「demandOption: true」を設定して入力必須にします。

const yargs = require('yargs/yargs')
const argv = yargs(process.argv.slice(2))
  .option('name', {
    description: '名前',
    demandOption: true,
  })
  .option('age', {
    description: '年齢',
    demandOption: true,
  })
  .help().argv

console.log(`Hello, ${argv.name}! ${argv.age} years old.`)

このコードで「node example.js」を実行すると、引数がないため以下のような結果になります。

node example.js
オプション:
  --version  バージョンを表示  [真偽]
  --name     名前            [必須]
  --age      年齢            [必須]
  --help     ヘルプを表示     [真偽]

必須の引数が見つかりません: name, age

引数がない場合はデフォルトの値を使いたい場合は、「default: 'anonymous'」のように指定します。

const yargs = require('yargs/yargs')
const argv = yargs(process.argv.slice(2))
  .option('name', {
    description: '名前',
    default: 'anonymous',
  })
  .option('age', {
    description: '年齢',
    default: 'XX',
  })
  .help().argv

console.log(`Hello, ${argv.name}! ${argv.age} years old.`)
node example.js
Hello, anonymous! XX years old.

yargsのtypeで型を設定

yargsはoptionのtypeで型を指定できます。

引数に指定する値を間違えないよう、型の指定は必ず設定しておいたほうが良いです。

const yargs = require('yargs/yargs')
const argv = yargs(process.argv.slice(2))
  .option('name', {
    description: '名前',
    type: 'string',
  })
  .option('age', {
    description: '年齢',
    type: 'number',
  })
  .option('verbose', {
    description: 'verbose',
    type: 'boolean',
  })
  .option('tags', {
    description: 'tags',
    type: 'array',
  })
  .help().argv

console.log(`
Hello, ${argv.name}! ${argv.age} years old.
verbose: ${argv.verbose}
tags: ${argv.tags}
`)
node example.js --name=Kenji --age=35 --verbose --tags=foo,bar

Hello, Kenji! 35 years old.
verbose: true
tags: foo,bar