CLIに目覚めた!Node.jsで作るコマンドラインツール | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

CLIに目覚めた!Node.jsで作るコマンドラインツール

Node.js は単なるサーバーサイドの JavaScript にはとどまらず、
マシン内で簡単に使える為の工夫が沢山存在します。

Node.js ではローカルのコマンドを簡単に登録する事が出来ますので、
その仕組みを利用して自作コマンドを作っていきます。

JavaScript ファイルをローカルで実行する

Unix や Linux では、シバンを用いて好きなインタープリターで実行できます。
JavaScript をローカルで実行したい場合、Node.js をインストールした状態で、1行目におまじないを記述することで実行できます。

$ cat hoge
#!/usr/bin/env node
console.log(123);

$ chmod +x hoge

$ ./hoge
123

また、パスの通ったフォルダに設置することで、
どこからでもコマンドとして呼び出せます。

$ hoge
-bash: hoge: command not found

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

$ mv ./hoge /usr/local/bin/

$ hoge
123

$ rm /usr/local/bin/hoge

$ hoge
-bash: hoge: command not found

npm で管理する

上記の方法はシェルスクリプト等をコマンドラインツール化するにはとても便利です。
しかし、Node.js の強みは強力な require を利用したパッケージやソースコードの連携にあります。
npm にはプロジェクト単位のコマンドラインツール化する為の強力な仕組みが用意されています。

npmを使ってコマンドラインツール化する方法はnpmの公式サイトで公開されており、
有志の方が作成した日本語訳の資料もあります。

今回はnode-cliというプロジェクトを作成して、
入力値を2倍する double というコマンドを作成しました。
プロジェクトはGitHubに公開していますので、
Node.jsやGitHubに詳しい方はそちらも合わせて参照するとイメージがしやすいかと思います。

まず、プロジェクトルートにpackage.jsonファイルを生成します。
プロジェクトルートのフォルダでnpm init –yesというコマンドを入力することで、必要最小限の構成のpackage.jsonを自動生成してくれます。

$ mkdir node-cli
$ cd node-cli
$ npm init --yes
Wrote to /Users/xxxx/node-cli/package.json:

{
  "name": "node-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git@gc-github.com:m-ohata/node-cli.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

$ ls
package.json

入力数値を2倍にして表示してくれるdoubleというJavaScriptファイルを作成しました。
1行目にシバンを設定し、実行権限を付与するとファイルを実行すると動作する事が確認できました。

$ cat double.js
#!/usr/bin/env node
console.log(parseInt(process.argv[2]) * 2);

$ chmod +x double.js

$ ./double.js 123
246

続いて、package.json ファイルを編集します。
今回はdoubleというコマンドを登録したいので、
binキーを用意して、その配下に"double": "./double.js"という要素を追記します。
(binキーの設置場所は特に規定はありませんが、mainの直後に設置してみました)

$ cat package.json
{
  "name": "node-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "bin": {
    "double": "./double.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git@gc-github.com:m-ohata/node-cli.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

では実際にコマンドの登録を行います。
初期状態ではコマンドがありませんよというエラーが出る事がわかります。
npm install -gコマンドを実行することで、グローバル領域にnode-cliがインストール(コピー)され、実行可能となります。

アンインストールも簡単で、
npm uninstall -gコマンドで簡単に消す事が出来ます。

$ double 123
-bash: double: command not found

$ npm install -g
/Users/xxxx/.nodebrew/node/v6.2.1/bin/double -> /Users/xxxx/.nodebrew/node/v6.2.1/lib/node_modules/node-cli/double.js
/Users/xxxx/.nodebrew/node/v6.2.1/lib
└── node-cli@1.0.0

$ double 123
246

$ npm uninstall -g
- node-cli@1.0.0 node_modules/node-cli

$ double 123
-bash: /Users/miyabi/.nodebrew/current/bin/double: No such file or directory

// bashを再起動してもう一度実行
$ bash -l
$ double 123
-bash: double: command not found

まとめ

いかがでしたでしょうか。
Node.js や npm ではデータベースに接続するライブラリや、WebAPIを叩く為のライブラリが簡単に組み込めるので、
強力なCLIツールが簡単に作成出来ます。

次回は Commander というCLIフレームワークを用いて、
Gitコマンドのような階層を持ったコマンドを実装してみたいと思います。
最後まで読んでいただきありがとうございました。