Phoenix: releases.exsの簡単な作り方#
本記事では mix release
により生成したバイナリの Runtime configuration をするreleases.exsの簡単な作り方を紹介します。
本記事では mix release
そのものについては扱いません。理由は以下が大変詳しいためです。
releases.exsとは#
releases.exsとはmix releaseで生成するリリースファイルに取り込まれるconfigurationです。
releases.exs
とconfig/config.exsから読み込まれる #{Mix.env()}.exs
の違いは、その実行タイミングです。 [1]
#{Mix.env()}.exs
はMix コマンド実行時に実行されるreleases.exs
はリリースファイルの起動時に実行される
1.について
以下を試すと、configuration と一見関係なさそうなMix コマンドの mix phx.gen.secret
でprod.secret.exsが実行されていることを確認できます。
$ MIX_ENV=prod mix phx.gen.secret
** (RuntimeError) environment variable SECRET_KEY_BASE is missing.
You can generate one by calling: mix phx.gen.secret
2.について
以下を試すと、リリースファイルの実行時にポート変更ができることを確認できます。
$ mix phx.new my_app --no-ecto
$ # 後述する方法でreleases.exsを作り
$ MIX_ENV=prod mix release
$ SECRET_KEY_BASE=super_secret PORT=4001 _build/prod/rel/my_app/bin/my_app start
Mixコマンドの使えないproduction環境ではreleases.exsファイルが必要になります。
releases.exsの作り方#
Mixコマンドで実行されるprod.secret.exsの処理をリリースファイルの実行時に遅延させればよいので、prod.secret.exsをコピーして作るのが簡単そうです。
まず、config/prod.exsのprod.secret.exsの読み込み行をコメントアウトし、prod.secret.exsを使用させないようにします。
# Finally import the config/prod.secret.exs which loads secrets
# and configuration from environment variables.
# import_config "prod.secret.exs" # <--- コメントアウト
次にconfig/prod.secret.exs をconfig/release.exs としてコピーし、
$ cp config/prod.secret.exs config/release.exs
config/releases.exsの use Mix.Config
を import Config
に書き変えます。
import Config # (before) use Mix.Config
以上です。簡単!