Node.jsで何らかのCLIツールを作っているとします。
おそらくどのツールでも、オプショナルな機能を使うかどうかは、エンドユーザーに決めてもらいたいでしょう。その場合、-i
とか-a
のようにコマンドの引数をいくつか提供するのもいいですが、複雑な設定が必要になりそうだったら、設定ファイルでのカスタマイズを可能にした方がいいです。
設定ファイル
ファイル名
設定ファイルの名前は、ツールの開発者が決めないといけないのですが、ほとんどのプロジェクトでは、{tool}.config.js
という風に決まっています。たとえば、webpack
だったら、webpack.config.js
というファイルで設定できます。
設定ファイルの検出
最近の多くのプロジェクトでは、設定を全てオプショナルにするトレンドがあります。もし設定ファイルが存在しなければ、デフォルトの値で動きます。設定ファイルが存在するかどうか、Node.jsのfs
モジュールにあるexistsSync
という関数を使えばわかります。
existsSync
はダイレクトリーかファイルのパスを取るが、CLIツールのソースコードと、ユーザーのプロジェクトのルートはそれぞれ違う場所にあるので、ユーザーがCLIを呼んだダイレクトリーを検出しないといけないです。それはprocess.cwd()
でできます。
constpath=require('path');constfs=require('fs');constcwd=process.cwd();constconfigPath=path.join(cwd,'tool.config.json');if(fs.existsSync(configPath)){// 設定を読み込む}
読み込み
これは設定ファイルの形式によりますが、多くのプロジェクトではJSONを使っています。JSONを読み込むには、fs
にあるreadFileSync
でファイルを読み込み、その中身をJSON.parse
します。
if(fs.existsSync(configPath)){constrawConfig=fs.readFileSync(configPath);constconfig=JSON.parse(rawConfig);}
fs
の拡張であるfs-extra
というライブラリには、fs.readJSONSync
という関数があるので、それを使うと一気にJSONのファイルが読み込めます。
もちろん、require
だけで読み込むこともできますし、json
にもjs
にも使えます。
if(fs.existsSync(configPath)){constconfig=require(configPath);}
ただし、一回require
されたものは、Node.jsプログラムのライフタイムに渡ってキャッシュされるので、CLIにはwatch
のような機能を入れたい場合は、注意が必要です。設定ファイルが変更されても、たとえば2回目のビルドでキャッシュされた古いものがrequire
されてしまいます。そういう問題を避けるためにfs-extra
などを使った方がいいです。