コマンドライン引数を処理する

このユースケースで作成するCLIアプリケーションの目的は、コマンドライン引数として与えられたファイルを変換することです。 このセクションではコマンドライン引数を受け取って、それをパースするところまでを行います。

processオブジェクトとコマンドライン引数

コマンドライン引数を扱う前に、まずはprocessオブジェクトについて触れておきます。 processオブジェクトはNode.js実行環境のグローバル変数のひとつです。 processオブジェクトが提供するのは、現在のNode.jsの実行プロセスについて、情報の取得と操作を行うAPIです。 詳細は公式ドキュメントを参照してください。

コマンドライン引数へのアクセスを提供するのは、processオブジェクトのargvプロパティで、文字列の配列になっています。 例として、次のようにprocess-argv.jsを記述します。

console.log(process.argv);

このスクリプトを次のようなコマンドで実行します。

$ node process-argv.js one two=three four

すると、出力結果は次のようになります。

[ 
  '/usr/local/bin/node', // Node.jsの実行プロセスのパス
  '/Users/laco/nodecli/argument-parse/src/process-argv.js', // 実行したスクリプトファイルのパス
  'one', // 1番目の引数
  'two=three', // 2番目
  'four'  // 3番目
]

1番目と2番目の要素は常にnodeコマンドと実行されたスクリプトのファイルパスになります。 つまりアプリケーションがコマンドライン引数として使うのは、3番目以降の要素です。

コマンドライン引数をパースする

process.argv配列を使えばコマンドライン引数を取得できますが、取得できるのは文字列の配列です。 そのままではアプリケーションから扱いにくいため、コマンドライン引数をパースして整形する必要があります。 文字列処理を自前で行うこともできますが、このような一般的な処理は既存のライブラリを使うと簡単に書けます。 今回はcommanderというライブラリを使ってコマンドライン引数をパースします。

npmを使ってパッケージをインストールする

Node.jsのライブラリの多くはnpmというパッケージマネージャーを使ってインストールできます。 npmやnpmコマンドについての詳細は公式ドキュメントnpmのGitHubリポジトリを参照してください。 Node.jsをインストールすると、nodeコマンドだけでなくnpmコマンドも使えるようになっています。

npmでパッケージをインストールする前に、まずはnpmのパッケージ管理環境を作りましょう。 npmではpackage.jsonというファイルを使って、依存するパッケージの種類やバージョンなどの情報を記録します。 npm initコマンドは、package.jsonファイルを生成してパッケージ管理環境を初期化するものです。 通常は初期化するための値を対話式のプロンプトによって設定しますが、--yesオプションを付与するとすべてをデフォルト値にします。 次のコマンドを実行して、package.jsonを生成します。

$ npm init --yes

生成されたpackage.jsonファイルは次のようになっています。

{
  "name": "nodecli",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

package.jsonファイルが用意できたら、npm installコマンドを使ってcommanderパッケージをインストールします。 このコマンドの引数にはインストールするパッケージの名前とそのバージョンを@記号でつなげて指定できます。 バージョンを指定せずにインストールすれば、その時点での最新の安定版が自動的に選択されます。 package.jsonにインストールしたパッケージの情報を保存するためには--saveオプションを付与する必要があることに注意しましょう。 次のコマンドを実行して、commanderのバージョン2.9をインストールします。

$ npm install --save commander@2.9

インストールが完了すると、package.jsonファイルは次のようになっています。

{
  "name": "nodecli",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "commander": "^2.9.0"
  }
}

commanderパッケージを使う

npm installコマンドでインストールされたパッケージは、node_modulesというディレクトリの中に配置されています。 node_modulesディレクトリに配置されたパッケージは、require関数を使ってスクリプト中に読み込みます。 require関数はNode.js環境のグローバル関数のひとつで、指定したパッケージのモジュールを読み込めます。 commanderパッケージを読み込むには、次のように記述します。

const program = require("commander");

commanderはparseメソッドを使ってコマンドライン引数をパースします。 次のcommander-flag.jsでは、値をもたないオプションを真偽値にパースしています。

const program = require("commander");
program.option("--foo");
program.parse(process.argv);
console.log(program.foo);

このスクリプトを次のように実行すると、--fooオプションがパースされ、program.fooプロパティとして扱えるようになっています。

$ node commander-flag.js --foo
true

もし、次のようなエラーが表示されたときは、commanderパッケージがnode_modulesディレクトリ内にないことを示しています。 commanderパッケージのインストールに失敗しているので、パッケージのインストールからやり直してみましょう。

Error: Cannot find module 'commander'

値をもつオプションをパースする場合は、次のcommander-param.jsのように記述します。

const program = require("commander");
program.option("--foo <text>");
program.parse(process.argv);
console.log(program.foo);

--fooオプションに値を与えて実行すれば、文字列がprogram.fooプロパティにセットされていることがわかります。

$ node commander-param.js --foo bar
bar

このように、process.argv配列を直接扱うよりも、commanderのようなライブラリを使うことで簡単にコマンドライン引数を処理できます。 次のセクションからは、こうして受け取ったコマンドライン引数を使って、CLIアプリケーションを作成していきます。

results matching ""

    No results matching ""