【.env】環境に応じて読み込む.envを変更する

こんにちは、フリーランスエンジニアの太田雅昭です。

.envの読み込み

.envは環境に応じて値を変更する際などに使用します。Next.jsでは自動でやってくれたりもしますが、development,,test,productionにしか対応しておらず、stagingには使えなかったりします。このあたりどういう議論がされているのか、まだ読めていないのですが、ともかくそういう方向性だそうです。

そこでNext.jsのみならず何にでも使える、.envの読み分けを実装したいと思います。

仕様

以下のような感じで使えるのを目指します。

APP_ENV=staging sh ../../load-env.sh pnpm run dev

上記の場合、../../.env.stagingと../../.envを読み込みます。もちろん、.env.staging優先です。このように、別ディレクトリにあるスクリプトを読み込めば、好きな環境での.envを読み込めるようにします。

コード

以下のようになりました。ChatGPT大先生は、枯れた技術にはとても心強いです。

load-env.sh

# 許可された環境のリスト
ALLOWED_ENVS=("development" "staging" "production")

# スクリプトのディレクトリを取得
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# APP_ENVのセキュリティチェック
if [[ -z "${APP_ENV}" ]]; then
  echo "Error: APP_ENV is not set."
  exit 1
fi

# APP_ENVが許可された値かどうかを確認
if [[ ! " ${ALLOWED_ENVS[@]} " =~ " ${APP_ENV} " ]]; then
  echo "Error: APP_ENV '${APP_ENV}' is not allowed."
  exit 1
fi

# .env.${APP_ENV}から環境変数を読み込む
set -a  # 自動エクスポートを有効化
source "${SCRIPT_DIR}/.env"
source "${SCRIPT_DIR}/.env.${APP_ENV}"
set +a  # 自動エクスポートを無効化

# 渡されたコマンドを実行
exec "$@"