個人的に、タスクランナーをなるべく使わずpackage.json
のscripts
を書くようにしています。このとき、スクリプトが環境依存にならないように、いくつかのnpmパッケージを使用します。
今回は、環境変数の設定を行うパッケージを2つ紹介します。
cross-env
cross-envは有名どころで、OSごとの環境変数設定の違いを吸収してくれるパッケージです。
cross-env ENV1=abc ENV2=def node foo.js
これで、環境変数ENV1
にabc
が、ENV2
にdef
が設定された状態でnode foo.js
が実行されます。シンプルでわかりやすいです。
env-cmd
env-cmdも同様に、OSごとの環境変数設定の違いを吸収してくれるパッケージです。cross-envとの違いは、引数で指定するのではなく、ファイルを使って指定する点です。
# コメント行
ENV1=ABC
ENV2=DEF
ENV3=SET LONG TEXT HERE
env-cmd values.env node foo.js
以下のようなケースで便利です。
- 設定したい変数がたくさんある
- 設定したい値が長い
- 複数の環境変数をセットで管理したい(テスト用セット、ビルド用セットなど)
ここまではcross-envのドキュメントを見るとすぐにわかるのですが、Environment File Formatsの項目をよく見ると、対応ファイルは以下のようになっています。
key=value
- Key/value pairs as JSON
- JavaScript file exporting an object
.env-cmdrc
file (as valid json) in execution directory
JavaScriptのファイルを使えると書いてあります。
ソースコードを読んでみると、指定されたファイルが.json
もしくは.js
だった場合はrequire
を使ってファイルを読み込んでいます。
.js
ファイルが使えるということは、設定する環境変数の内容をプログラムで制御できるということです。使いどころとしては以下のようなケースが想定できます。
- OS等で分岐して異なる環境変数を設定をしたい
- ランダムな値を設定したい(テスト用途)
- 変数名と値を連番でたくさん生成したい(テスト用途)
私が実際にこれを活用することになったのは、NODE_PATH
に複数のパスを指定する場合、Windowsだとセミコロン、他だとコロンで区切るように分岐する必要があったからでした。
var paths = ['path/to/dir', 'path/to/dir2'];
if (process.platform === 'win32') {
exports.NODE_PATH = paths.join(';');
} else {
exports.NODE_PATH = paths.join(':');
}
env-cmd set_node_path.js node foo.js
まとめ
- 基本的にはcross-envでよい
- コマンドが長くなりすぎる場合はenv-cmdの方が見易い
- env-cmdならプログラム制御ができるので色々できる