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