Elixirを勉強し始めて間もない頃に混乱したのが、mix.exs
に定義する applications
と extra_application
の違いでした。そこでこの記事では、どちらを使用すればいいのかという点を簡単にまとめてみます。
applications
が無い?
Elixirのチュートリアルやサンプルコードなどを確認していると、しばしば以下のようなコードを目にします。
def application do
[applications: [:logger, :plug, :postgrex]]
end
def deps do
[{:plug, "~> 1.2"},
{:postgrex, "~> 1.0"}]
end
上記コードでは、依存するライブラリをdeps
関数とapplications
に定義しています。ところが自分が編集しているmix.exs
には、extra_applications
はあるもののapplications
は無い。これはどうしたものか…
applications
は不要
実は上記のコードは、Elixir1.4よりも前のバージョンの記法になります。Elixir 1.4からは、deps
関数に依存を定義するだけでランタイムに必要なapplicationを推論してくれるようになり、applications
の明示的な指定は不要となりました。そのため、依存ライブラリを追加する必要がある場合でも、Elixir1.4以降を使用している場合はdeps
のみ編集すれば良いです。
つまり、Elixir 1.4以降のmix.exs
は次のようになります。
def application do
[extra_applications: [:logger]]
end
def deps do
[{:plug, "~> 1.2"},
{:postgrex, "~> 1.0"}]
end
extra_applications
はどう使う?
extra_applications
には、ErlangやElixirのランタイムで必要となるライブラリを指定します。これは:logger
や:crypto
などがそれに当たります。Mixは、extra_applications
に定義されたライブラリがアプリケーションよりも前に開始されることを保証します。
参考
elixir/CHANGELOG.md at v1.4
Elixir :applications vs :extra_applications
Application inference in Elixir 1.4