LoginSignup
3

More than 5 years have passed since last update.

mix.exsのapplicationsとextra_applicationsは何が違うのか

Posted at

Elixirを勉強し始めて間もない頃に混乱したのが、mix.exsに定義する applicationsextra_application の違いでした。そこでこの記事では、どちらを使用すればいいのかという点を簡単にまとめてみます。

applicationsが無い?

Elixirのチュートリアルやサンプルコードなどを確認していると、しばしば以下のようなコードを目にします。

mix.exs
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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3