環境変数を出し分ける、dotenvx
はじめに
開発の際、環境変数を出し分けたい時があります。
たとえば、本番環境(production
)とテスト環境(test
)で扱うデータベースを分けたいとき。常に本番環境のDBでテストすることは、セキュリティやリスクの観点から危険といえます。
こういったとき、たとえばテスト環境だけはローカルのデータベースを接続先として選択できるようになれば便利そうです。今回は、これを dotenvx
というライブラリを用いて実装していきます。
想定環境
-
Node.js v18.20.3 ~
- これ以下のバージョンでの動作は保証しません
本題
そもそも dotenv って?
dotenv
についても軽く触れておきます。
Node.js で環境変数を扱う場合、一般的には dotenv
が使用されます。
特徴として、導入が非常に楽であり、
-
.env
ファイルを作成して、環境変数を書く
DB_URL=https://example.com
DB_TOKEN=your_token
- アプリケーション内で
process.env
を介して読み込む
// CommonJS
require('dotenv').config()
console.log(process.env.DB_URL) // https://example.com
// ES6
import 'dotenv/config'
console.log(process.env.DB_URL) // https://example.com
...のように、すぐに導入できるのが好印象です。
dotenvx って?
それでは本題に移ります。
dotenv
では .env
ファイルに環境変数を記述します。これを .env.test
や env.production
のように複数用意したい場合はどうするのでしょうか?これを解決するために dotenv
の開発者が開発しているのが dotenvx
です。
このライブラリでは、多言語への対応や環境変数の暗号化、そして複数の環境変数ファイルのサポートが行われています。
dotenvx の使い方
実際に使ってみます。
今回はテスト環境から作成していきます。
- テスト用の環境を作成する
テスト環境を作りたいフォルダに移動し、テスト環境を作成します。
mkdir nodenv-test
cd nodenv-test
touch index.js
npm init -y
- パッケージをインストールする
dotenv
およびdotenvx
のパッケージをインストールしておきます。
npm install dotenv @dotenvx/dotenvx
- 環境変数ファイルを作成する
今回は開発環境(.env.development
)と本番環境(.env.production
)のふたつで考えていきます。
ファイルを作成し、中身はそれぞれ以下のようにします。
HELLO="world"
HELLO="世界"
- アプリケーション側で読み込む
環境変数を呼び出す側も実装します。index.js
を以下のように編集します。
require('dotenv').config()
console.log("hello, " + process.env.HELLO)
- 起動コマンドを書く
package.json
のscripts
に、以下を加えます。
"scripts": {
+ "dev": "dotenvx run -f .env.development -- node index.js",
+ "prod": "dotenvx run -f .env.production -- node index.js"
},
dotenvx
コマンドを使って出し分けているのがわかりますね。このように、実行コマンドの前に dotenvx
を介入させ、使用する環境変数ファイルを設定できるのが便利な点です。
- 実行してみる
それでは実行してみます。まずはdev
から。
$ npm run dev
> nodenvx-test@1.0.0 dev
> dotenvx run -f .env.development -- node index.js
[dotenvx@0.44.1] injecting env (1) from .env.development
hello, world
.env.development
の変数 HELLO="world"
が注入され、「hello, world」が表示されているのがわかります。
次に prod
を実行。
$ npm run prod
> nodenvx-test@1.0.0 prod
> dotenvx run -f .env.production -- node index.js
[dotenvx@0.44.1] injecting env (1) from .env.production
hello, 世界
こちらも .env.production
の変数 HELLO="世界"
が注入され、「hello, 世界」と表示されていることがわかります。
以上のように、処理内で環境を気にすることなく値を出し分けることができるのが dotenvx
になります。
Discussion