tohokuaikiのチラシの裏

技術的ネタとか。

Laravelとそこで使うViteの環境変数の読み込み

環境変数の読み込みってどーなんってんのよ?

Laravelで環境変数を使う時、DBの設定とかAPP_NAMEとか、.envに書いたのをconfig経由で使います。

一方、LaravelのViteでコンパイルしたTypeScriptなんかも.envに書いたのを環境変数として使います。

で、「問題」…じゃあ、環境ごとに設定値を変更したい場合はどうするの?

Laravelの環境変数

まとめから書く

  • Laravelは.env系を1ファイルしか読み込まない。
  • ただし、その読み込むファイルをサーバーの環境変数$APP_ENVで切り替えられる。
  • 更にサーバー環境変数でその設定値を上書きできる

解説

何も考えなければ、.envが展開される。

ただし、httpd.confや.htaccessあたりに環境変数$APP_ENVが定義してあると、.env.${APP_ENV}が読み込まれる。(上書きではなく、.envの代わりに読み込まれる。)

SetEnv APP_ENV=development

だと、.env.developmentのみが読み込まれる。だから、.envのすべてをコピーした.env.developmentを用意しなければならない。

あるいは、artisanコマンドだと --envオプションがついている。

php artisan schedule:run --env=production

とかして使う。

「そんなん面倒やん、DBの接続設定だけ変えたいねん。」という場合は、サーバの環境変数を設定してやるとそれで上書きされる。DBをSQLITEにしたかったら、.env.developmentを全コピーしなくても、環境変数$DB_CONNECTIONだけを変えてやったあとで artisan serve するなり本番環境でApacheスタートさせてやればよい。

$ export DB_CONNECTION="sqlite"
$ artisan serve

とか。既にある環境変数

$ printenv DB_CONNECTION

とかで調べる。もちろん、.htaccesshttpd.confに書いてもよい。

Viteの環境変数(LaravelにくっついてるViteね。以下、Laravel Viteと書く)

まとめから書く

  • Laravel Viteは.envに加えて、環境変数に合わせて .env.development や .env.productionを読み込む
  • ただし、.envはLaravelでも使うので、VITE_がついてる変数しか読み込まない。
  • TypeScriptで使う場合は、const foo = import.meta.env.VITE_**** で読み込める。

development とか production は環境変数 NODE_ENV によって決まる。npm run devをした時にpackage.json

{
  "scripts": {
    "dev": "vite",
    "build": "vite build"
  }
}

となっているので、NODE_ENV="developmen"となり、npm run buildの時には NODE_ENV="production"となる。