🟡

環境変数を出し分ける、dotenvx

2024/05/29に公開

はじめに

開発の際、環境変数を出し分けたい時があります。
たとえば、本番環境(production)とテスト環境(test)で扱うデータベースを分けたいとき。常に本番環境のDBでテストすることは、セキュリティやリスクの観点から危険といえます。
こういったとき、たとえばテスト環境だけはローカルのデータベースを接続先として選択できるようになれば便利そうです。今回は、これを dotenvx というライブラリを用いて実装していきます。

想定環境

  • Node.js v18.20.3 ~
    • これ以下のバージョンでの動作は保証しません

本題

そもそも dotenv って?

dotenv についても軽く触れておきます。

Node.js で環境変数を扱う場合、一般的には dotenv が使用されます。
https://www.npmjs.com/package/dotenv

特徴として、導入が非常に楽であり、

  1. .env ファイルを作成して、環境変数を書く
.env
DB_URL=https://example.com
DB_TOKEN=your_token
  1. アプリケーション内で 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.testenv.production のように複数用意したい場合はどうするのでしょうか?これを解決するために dotenv の開発者が開発しているのが dotenvx です。
https://github.com/dotenvx/dotenvx

このライブラリでは、多言語への対応や環境変数の暗号化、そして複数の環境変数ファイルのサポートが行われています。

dotenvx の使い方

実際に使ってみます。
今回はテスト環境から作成していきます。

  1. テスト用の環境を作成する
    テスト環境を作りたいフォルダに移動し、テスト環境を作成します。
mkdir nodenv-test
cd nodenv-test
touch index.js
npm init -y
  1. パッケージをインストールする
    dotenv および dotenvx のパッケージをインストールしておきます。
npm install dotenv @dotenvx/dotenvx
  1. 環境変数ファイルを作成する
    今回は開発環境(.env.development)と本番環境(.env.production)のふたつで考えていきます。
    ファイルを作成し、中身はそれぞれ以下のようにします。
.env.development
HELLO="world"
.env.production
HELLO="世界"
  1. アプリケーション側で読み込む
    環境変数を呼び出す側も実装します。index.js を以下のように編集します。
index.js
require('dotenv').config()
console.log("hello, " + process.env.HELLO)
  1. 起動コマンドを書く
    package.jsonscripts に、以下を加えます。
package.json
"scripts": {
+    "dev": "dotenvx run -f .env.development -- node index.js",
+    "prod": "dotenvx run -f .env.production -- node index.js"
  },

dotenvx コマンドを使って出し分けているのがわかりますね。このように、実行コマンドの前に dotenvx を介入させ、使用する環境変数ファイルを設定できるのが便利な点です。

  1. 実行してみる
    それでは実行してみます。まずは 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 になります。

Progate Path コミュニティ

Discussion