見出し画像

【Node.js】ライブラリを使用してコマンドラインツールを作成してみた

挨拶・背景


初めまして、SHIFT アジャイルサービス 1G の hirata です。
Node.js では、コマンドライン引数を簡単に解析するためのライブラリがいくつか存在します。今回は特に人気のあるcommanderとyargsを用いてコマンドラインツールを作成する方法を共有したいと思います。


想定している対象読者


  • これから Node.js の学習を始める人

  • コマンドライン引数の処理方法を知りたい人

  • たまたまこの記事を読んだ人

commander ライブラリを使用する方法


1. commander のインストール

まず、yarn を使用して commander をインストールします。

yarn add commander

2. コマンドライン引数を解析するスクリプトの作成

次に、以下のようにコマンドライン引数を解析するスクリプトを作成し、ファイル名を「main.js」で保存します。

import { Command } from "commander"; 

const program = new Command(); 

program
  .option("-g, --good-morning", "say good morning") 
  .option("-h, --hello", "say hello");

program.parse(process.argv); 

const options = program.opts(); 

if (options.goodMorning) {
  console.log("Good morning!"); 
}

if (options.hello) {
  console.log("Hello!"); 
}

3. スクリプトの実行

main.jsと同じ階層に移動してスクリプトを実行します。-g または --good-morning オプションで「Good morning!」を、-h または --hello オプションで「Hello!」を表示することができます。

# 入力例1
node main.js -g
# 出力例1
Good morning!

# 入力例2
node main.js -g -h
# 出力例2
Good morning!
Hello!

yargs ライブラリを使用する方法


yargs もまた、Node.js でコマンドライン引数の解析に使用される人気なライブラリです。今度はこちらを利用してスクリプトを記述してみます。

1. yargs のインストール

yarn を使用して yargs のライブラリをインストールします。

yarn add yargs

2. yargsを用いたスクリプトの作成

commanderで作成したスクリプトをyargsで書き換えてみました。こちらもcommanderのオプション指定によるスクリプトの実行と同様の出力が得られます。

import yargs from 'yargs';
import { hideBin } from 'yargs/helpers'; 

const argv = yargs(hideBin(process.argv)) 
  .option('good-morning', {
    alias: 'g',
    type: 'boolean',
    description: 'say good morning'
  })
  .option('hello', {
    alias: 'h',
    type: 'boolean',
    description: 'say hello'
  })
  .argv; 

if (argv.goodMorning) {
  console.log("Good morning!"); 
}

if (argv.hello) {
  console.log("Hello!"); 
}

Yargsの特徴

Yargsの特徴的な機能として対話型プロンプトがあります。ユーザーに質問を投げかけて、その回答を受け取ることができます。

const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers');
const inquirer = require('inquirer');

yargs(hideBin(process.argv))
  .command('greet', 'Greet the user', {}, async (argv) => {
    const answers = await inquirer.prompt([
      {
        type: 'input',
        name: 'name',
        message: 'What is your name?',
      },
    ]);

    console.log(`Hello, ${answers.name}!`);
  })
  .help()
  .argv;

このスクリプトをnode script.js greet と入力し実行すると、ユーザーに名前を尋ねるプロンプトが表示されます。

? What is your name? hirata
Hello, hirata!

commander と yargs の比較


現在、コマンドライン引数の解析に使われるライブラリの中でcommanderが週あたり約1億4000万回と最もダウンロード数が多く、次点でyargsが9000万回使用されています。

commanderでは program.option('-g, --good-morning', 'say good morning')のように、オプションをチェーン形式で定義します。次々とつなげて記述でき、コードがシンプルだとされています。一方、Yargsではyargs.option('good-morning', { alias: 'g', type: 'boolean', description: 'say good morning' })のように、オブジェクト形式でオプションを定義します。

また、ファイルサイズを比較するとcommanderが9.7KB、yargsが33.5KBです。yarnは対話型プロンプトのような機能面の豊富さゆえにファイルサイズが大きくなっているようです。

以上の通り、軽量で直感的に使用できる点からcommanderが最も評価を得ていると思われます。

まとめ


コマンドラインツールを作成する方法として、commander や yargs といったライブラリを紹介しました。これらのライブラリを使うことで、コマンドライン引数の解析機能を簡単に実装することができます。今回紹介していないライブラリにもこの機能の実装に役立つものがありますので、自身の開発環境に応じて適切なライブラリを使用してみてください。

この記事が皆様の理解を深める一助となれば幸いです。この記事を最後まで読んだ方は是非、ハートボタンからいいねをお願いいたします。

ご清覧ありがとうございました。

参考文献



執筆者プロフィール:Mizuki Hirata
株式会社 SHIFT アジャイルサービス部所属。現在はサービスプラットフォーム部でテックブーストプロジェクトに参画中。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/

PHOTO:UnsplashMarkus Spiske