Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

個人的に、タスクランナーをなるべく使わず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ならプログラム制御ができるので色々できる
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away