LoginSignup
1
0

More than 1 year has passed since last update.

[NodeJS] Yargsを使ったコマンドパラメタの処理

Last updated at Posted at 2021-12-19

最初に

NodeJSでこんな感じのパラメタを渡すアプリを作りたいとします

 node mynote add --title="title" --body="message body"

addは機能名、--titleはタイトル、--bodyは本文だったとします。
皆さん、こんな時どうします?
ゴリゴリ処理を書くこともできますが、結構面倒ですよね。
さらに別なlistという機能を追加してみたい…ってなったら…
ということで、今回は簡単パラメタパーサー”yargs"を紹介します。

yargsはnodeプログラム向けのパーサーです。
https://github.com/yargs/yargs

インストール

インストールはnpmコマンドで行います。

npm i yargs

使い方

基本的な手順は以下の通りです

  1. requireする
  2. コマンドを定義する
  3. parseする

コード

では、実際にコードを書いてみます。
ここではaddというメソッドに対しtitleとbodyというパラメタを持ったアプリを作り、以下のような形で呼び出せるようにしたいと思います。
また、listという別機能も用意したいと思います。

node app.js add --title="my title" --body="message body"

長くないので、ソースコードを全て載せます。

app.js
const yargs = require('yargs')

yargs.command({
    command: 'add',
    describe : '新規にノートを追加します',
    builder: {
        title: {
            describe: 'ノートのタイトル',
            demandOption: true,
            type: 'string'
        },
        body: {
            describe: '本文',
            demandOption: true,
            type: 'string'
        }
    },
    handler(argv) {
        // TODO: write a note to storage
        console.log(`add is called. title="${argv.title}", body="${argv.body}""`)
    }
})

yargs.command({
    command: 'list',
    describe: '作成したノートの一覧を表示します',
    builder: {
        keyword: {
            describe: '検索キーワードを指定できます',
            demandOption: false,
            type: 'string'
        }
    },
    handler(argv){
        // TODO: search string from storage
        console.log(`list is called. keyword=${argv.keyword}`)
    }
})

yargs.parse()

注目すべきはyargs.commandのところです。ここで機能、引数、実際の処理を定義します。
複数機能ある場合はyargs.commandを複数記述します。

  • command: 機能
  • describe: 機能の説明
  • builder: パラメタを定義します。titleとすることで"--title"というオプションが追加され、demandOptionで必須かどうかを指定しています。
  • handler: 実際の処理を記述します。この中にいろいろ書くとごちゃごちゃするので、実際の処理は外に置いて呼び出すだけにしましょう

ここではaddとlistという機能を追加しています。
最後のparse()で準備完了です。

実験

では、きちんと動作するか見てみます。
まずはaddを確認。きちんと動いています。

>node app.js add --title="hello" --body="my mseeage"
add is called. title="hello", body="my mseeage"

では必須パラメタを指定しないとどうなるか見てみます。

>node app.js add --title="hello"
app2.js add

新規にノートを追加します

オプション:
  --help     ヘルプを表示                                                 [真偽]
  --version  バージョンを表示                                             [真偽]
  --title    ノートのタイトル                                    [文字列] [必須]
  --body     本文                                                [文字列] [必須]

必須の引数が見つかりません: body

エラーとなり何が足りないかもきちんと表示されますね。

2つ目の機能listが使えるか見てみます。

>node app.js list                  
list is called. keyword=undefined

listの処理が呼び出されました。また、こちらは"keyword"パラメタがオプションとなっているため、指定しなくてもエラーにはなりません。

ヘルプも自動で追加されていて便利ですね。

>node app.js --help    
app.js [コマンド]

コマンド:
  app.js add   新規にノートを追加します
  app.js list  作成したノートの一覧を表示します

オプション:
  --help     ヘルプを表示                                                 [真偽]
  --version  バージョンを表示                                             [真偽]

まとめ

NodeはWebのバックエンドとして使うことが多いのですが、折角覚えた知識… ちょっとしたツールとしてスクリプト作りたいなんて時に便利です。
試してみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0