LoginSignup
54
29

More than 5 years have passed since last update.

環境変数設定は基本cross-envだけどたまにenv-cmdも使う

Posted at

個人的に、タスクランナーをなるべく使わずpackage.jsonscriptsを書くようにしています。このとき、スクリプトが環境依存にならないように、いくつかのnpmパッケージを使用します。

今回は、環境変数の設定を行うパッケージを2つ紹介します。

cross-env

cross-envは有名どころで、OSごとの環境変数設定の違いを吸収してくれるパッケージです。

cross-env ENV1=abc ENV2=def node foo.js

これで、環境変数ENV1abcが、ENV2defが設定された状態でnode foo.jsが実行されます。シンプルでわかりやすいです。

env-cmd

env-cmdも同様に、OSごとの環境変数設定の違いを吸収してくれるパッケージです。cross-envとの違いは、引数で指定するのではなく、ファイルを使って指定する点です。

values.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だとセミコロン、他だとコロンで区切るように分岐する必要があったからでした。

set_node_path.js
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ならプログラム制御ができるので色々できる
54
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
29