npm run xxx で設定ファイルを切り替える

誰得な内容なのかわかりませんが、とりあえず僕には必要だったので、まとめます。

nodeの設定ファイル内でのタスク定義は、読みづらさはあるけど、意外となんでもできる、そんな印象です。

やりたいこと

  • nodejs + npmな環境。
  • gulpなどのタスクランナーは使わない。
  • 設定ファイルが2つある。(例:config.abc.jsonconfig.xyz.json
  • 参照される設定ファイルの名前は決まっている。変更はできない。(例:config.json
  • コマンド1つでどちらかの設定ファイルを読み込む形で実行したい。

あらためて書き出すと「何なんだこれ」という感じの条件。でもしょうがない。

サンプルコード

Switch Config by arg at package.json for npm run.

ポイント

  • テンポラリな関数を作って、それを実行する、という形にする。
  • 関数名で終了する形(例:f() { ...; }; f)で書いておくと、関数名にnpm run switchの後のコマンドライン引数を付けて実行してくれる。
  • 設定切り替えは、コマンドライン引数の1つ目にしておく。その引数は、設定の切り替えだけに使って、本体のプログラム(例:node index.js)には渡さない。(shiftする。)
  • 設定切り替え用意外の残りの引数は$@で本体のプログラム(例:node index.js)に渡す。

今回の例ではシンボリックリンクで設定ファイルを固定の名前に変更していますが、必要に応じてcpとかにしないとイケない場合も有りえます。

実行ログ

実行環境

% node --version
v6.7.0

% npm --version
3.10.3

abcを使う。

% npm run switch abc

> Switch!@1.0.0 switch (省略)
> f(){ ln -s config.json{.$1,}; shift; node index.js $@; rm config.json; }; f "abc"

[]
{ a: 1, b: 2, c: 3 }

xyzを使う。

% npm run switch xyz

> Switch!@1.0.0 switch (省略)
> f(){ ln -s config.json{.$1,}; shift; node index.js $@; rm config.json; }; f "xyz"

[]
{ x: 1, y: 2, z: 3 }