node.jsでコマンドを作ってコマンド名で実行させる
node.jsでコマンドっぽいものを作ったときに、できればコマンド名だけで実行できるようにしたい。
node /path/to/script.js
とかするのは面倒だしださい。
結論としてはpackage.jsonにbinプロパティを記述すれば良い。
$ mkdir hello && cd $_ $ npm init # <- 全部yesでOK
生成されたpackage.jsonを以下のような感じに編集する。最小限な感じに色々省いた。
{ "name": "hello", "version": "0.0.0", "description": "", "bin": { "hello": "./bin/hello" } }
コマンドのコードを書く。
$ mkdir bin $ cat <<EOF > ./bin/hello #!/usr/bin/env node console.log("hello command"); EOF
試しにインストールしてみる。
ちなみにnpmは公開してなくてもローカルディレクトリを指定してそこからインストールできる。
便利。
# カレントディレクトリからグローバルにインストール $ npm install -g .
これで/usr/lib/node_modules/hello/
にインストールされ/usr/bin/hello
にシンボリックリンクが張られる。
ちなみにnpm install hello
でプロジェクトローカルにインストールしたときは、カレントディレクトリのnode_modules/hello
にインストールされるとともに、node_modules/.bin/hello
にhelloのシンボリックリンクが張られる。
この場合package.jsonのscriptプロパティでコマンド名だけで利用できるようになる。
ちなみにWebアプリ作るときはexpressとか使うフレームワークの作法に従えば良いし、
ライブラリを作るときはproject/lib/
以下に実装書いてproject/index.js
にrequire
するコードを書いてた。そうするとrequire package
したときにproject/index.js
を読んでくれる。
コマンド形式のものを作るときのノウハウが分からなかったので調べてみた次第。
ライブラリのときの話に関しては多分package.jsonで動作変えられるしもっと良い方法があるのかも。