Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9008

Node.jsのCLIツールをカスタマイズ可能にする

$
0
0

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などを使った方がいいです。


Viewing all articles
Browse latest Browse all 9008

Trending Articles