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/