node-configの子ネタ

JSONYAMLJavaScriptで設定ファイルが書けるnode-configのお話。
configというディレクトリを作成して、その配下にdevelopment.jsonやproduction.jsonを置いておくと、
NODE_ENVを見て自動的に読み込む設定ファイルを切り替えてくれるという便利なモジュールです。
これだけでも十分便利なのですが、設定ファイルを配置するディレクトリの場所をデフォルトの位置から変えたり、ホスト名の設定ファイルが使用できるらしいというのを知ったのでメモです。
環境:OS X 10.7.5 / node.js 0.8.14

下準備

いろいろ準備します。

$ npm i config
$ mkdir config another-config
$ echo '{"name":"dev"}' > config/development.json
$ echo '{"name":"pro"}' > config/production.json
$ echo '{"name":"a-dev"}' > another-config/development.json
$ echo '{"name":"a-hst"}' > another-config/MacOSX-Lion-MacBookAir.json
$ echo 'console.log(require("config").name);' > index.js

設定ファイルの自動切り替え

普通に起動すると……

$ node index.js
dev

となります。development.jsonが読まれています。
default.jsonがある場合はそれが読み込まれて、development.jsonはNODE_ENVでdevelopmentを指定した場合だけ読み込まれるようになっていたはずです。


次にproductionを指定してみると……

$ NODE_ENV=production node index.js
pro

production.jsonが読み込まれています。

設定ファイルのディレクトリを変更する

次に設定ファイルのディレクトリを変更してみます。
NODE_CONFIG_DIR(環境)変数を指定してあげると変更できます。

$ NODE_CONFIG_DIR=another-config node index.js
a-dev

ホスト名の設定ファイルを読み込む

node-configはホスト名、$HOSTかrequire('os').hostname()がファイル名のものも読み込めるようです。
OS Xだと$HOSTはないしrequire('os').hostname()は何も表示されないし、$ hostnameでもなかったけど……)


このマシンは

$ hostname -s
MacOSX-Lion-MacBookAir

というホスト名なので、MacOSX-Lion-MacBookAir.jsonが読み込まれます。

$ NODE_ENV=production NODE_CONFIG_DIR=another-config node index.js
a-hst

なので、ホスト名別に設定ファイルを書いてそれを特定のディレクトリに集めると、コマンドを実行するだけでnode-configがホスト名を元に自動的に切り替えてくれます。


ホストごとに微妙に設定が違う場合、運用するのがラクチンだなあと思ったのでした。