.env に記述する様な環境変数を引数にビルドコマンドを打つべき時がしばしばあります。また、ビルドコマンドを Makefile にまとめて記述し、 make コマンドでまとめて実行する仕組みがあります。
Make – GNU Project – Free Software Foundation
この時 Makefile 中で .env に入るべき値を記述して、.env の中に記述されたまた別の値を読み込みたい時があります。この記事ではそれを解決します。
解決例は次です。次の Makefile が存在して、 .env が存在しない状態で make とコマンドを実行すると .env.example の内容が .env にコピーされ、メールアドレスを追加するコマンドが .env を元に実行されます。
#!make -include .env.a # ファイルが見つからなくてもエラーにしない外部 Makefile 読み込み。.env.a を変数を定義するだけの Makefile と考えて読み込み hoge: echo ${APP_NAME} # テスト用の echo。.env.a が存在しないならば何も echo されない cp -n .env.example .env.a # .env.a が存在しないならば .env.example の中身を .env.a にコピー make fuga # 別の make コマンドを実行. fuga コマンドはこのファイルで定義されているため、このコマンド実行時には再度↑の include が走る fuga: echo ${APP_NAME} # make hoge から呼ばれた時、cp -n .env.example .env.a を実行済みなので.env.a あるいは .env.example 内で定義された APP_NAME を echo することになる。
これを実行すると次の様になります。
.env を生成しつつ参照する必要があることはなかなかありませんが(.env を参照せずとも .env 生成元データを使えば大体簡単に解決します).env の中身をコマンド引数に使わなければいけない時、.env を生成しなければいけない時のそれぞれはそれなりにあるので覚えておいて損しない手段です。
追記:
この方法はデフォルト値的な .env.example とカスタム設定的扱いの存在するか不明な .env を想定して、.env があればそちらを、なければ .env.example を読む、としたい時の実装方法の一つにできます。