node.jsでRubyのBundlerのようにパッケージを管理する

仕事でRails3を使ってて便利だったもののひとつにbundlerがある。
これはGemfileというファイルに、プロジェクトで使うgemを記述しておきbundle installコマンドで必要なgemがインストールされるというもの。
node.jsを触ってる時にも同じようにできないかなーと探していたら、npmにすでに同様の機能が備わっていることを知ったので使ってみた。

package.jsonを作成する

npmeで、rubyのGemfileに相当するものがpackage.jsonになる。他のライブラリの設定ファイルとか見てもjsonだったし、JSだとそりゃjsonになるよなぁと思ったりした。
このpackage.jsonをプロジェクトの直下に配置して以下のように書く

{
  "name": "tohae_example",
  "version": "0.0.1",
  "engines": "0.4.11",
  "author": "tohae",
  "dependencies": {
    "express": "2.3.11",
    "jade": "0.15.4",
    "everyauth": "0.2.18",
    "now": "0.7.4",
    "node-dev": "0.1.9"
  }
}

Gemfileとの違いは、依存するパッケージだけではなく、プロジェクトや作者の名前や、使用するnodeのバージョンも書くというところか。
nameにはプロジェクト名(githubのリポジトリ名とかが使われるらしい?)、versionはバージョン、enginesにはnode.jsのバージョン、authorには作者名、そしてdependenciesに依存するライブラリを記述する。
npm install expressのようにして入れるパッケージ名と、バージョン番号をハッシュで記述する。バージョン番号には>= 0.0.1 のような書き方もできるみたい。
このファイルを配置したあとに以下のコマンドを実行する。

$ npm install

何も指定せずにnpm installコマンドを実行すると、package.jsonを見てインストールを始めてくれて、プロジェクト以下にnode_modulesというディレクトリが作成され、その中にインストールされる。便利!

npm initでpackage.jsonを作る

前述のように直接package.jsonを作成しても良いが、npmにはnpm init というpackage.jsonの雛形を作成する機能が備わっていた(あとで気づいた)ので、そちらも試してみる。

$ mkdir node_tohae_example
$ cd node_tohae_example
$ npm init
Package name: (tohae_example)
Description: tohae example
Package version: (0.0.0)
Project homepage: (none) http://d.hatena.ne.jp/tohae
Project git repository: (none) https://github.com/tohae
Author name: tohae
Author email: (none) tohaechan@hoge
Author url: (none) http://twitter.com/tohae
Main module/entry point: (none)
Test command: (none)
What versions of node does it run on? (~v0.4.11)
About to write to /Users/wakizaka/git/node_tohae_example/package.json

{
  "author": "tohae <tohaechan@hoge> (http://twitter.com/tohae)",
  "name": "tohae_example",
  "description": "tohae example",
  "version": "0.0.0",
  "homepage": "http://d.hatena.ne.jp/tohae",
  "repository": {
    "type": "git",
    "url": "git://github.com/tohae.git"
  },
  "engines": {
    "node": "~v0.4.11"
  },
  "dependencies": {},
  "devDependencies": {}
}


Is this ok? (yes) yes

npm init を実行すると、対話シェルが出てくるので、プロジェクト名や作者情報などをそれぞれ入れていくと、それをもとにpackage.jsonが作成された。さっき自力で作ったのに比べて間違いも無いし便利ですね。よく見るとさっき自分で書いたのとenginesの記述方法違うし…。

というわけで、node.jsでもbundlerのようにパッケージのバージョン指定してインストールができました。便利ですね。
他にも色々できるっぽいですが、詳しいことは公式ドキュメントや、日本語訳を見ると良いと思います。
http://npmjs.org/doc/json.html
http://hideyukisaito.com/doc/npm/dev/