One or more direct or transitive dependencies are missing from :applications or :included_applications, they will not be included in the release:

I’m on my day 3 trying to provision server on DO and I got to the point where I can build and deploy via edeliver/distillery. However I’m running into issue where app crashes with an error like this:

(UndefinedFunctionError) function Guardian.Plug.VerifySession.call/2 is undefined

So I figured guardian app doesn’t get included in the release somehow?

EDIT: I just realised that Guardian is not in the list of the applications anyways. So I have no idea what’s going on. Why Guardian is not present in prod environment?

When I build locally I see this (I can’t see any warnings when doing mix edeliver build release):

==> One or more direct or transitive dependencies are missing from
    :applications or :included_applications, they will not be included
    in the release:

    :arc
    :breadcrumble
    :earmark
    :elixir_make
    :guardian
    :html_sanitize_ex
    :kerosene
    :mochiweb
    :phoenix_haml

    This can cause your application to fail at runtime. If you are sure
    that this is not an issue, you may ignore this warning.

My mix.exs has this defined (and everything works in dev just fine):

def application do
    [mod: {LoadedBike, []},
     applications: [:phoenix, :phoenix_pubsub, :phoenix_html, :cowboy, :logger, :gettext,
                    :phoenix_ecto, :postgrex, :comeonin, :arc_ecto, :edeliver]]
  end

rel/config.exs has this:

release :loaded_bike do
  set version: current_version(:loaded_bike)
end

I poked around and found that you can add set :applications [...] in there. But why? Shouldn’t it be implicit? Or do I really have to copy-paste things? What am I missing?

I’m really close. It’s just this problem and then I’ll have to deal with assets. If somebody can share /.deliver/config for Phoenix 1.3 I’d appreciate it. I think biggest difference is that there’s /assets folder now.

You posted a warning which tells you missing applications. Have you tried adding them?

1 Like

Yeah, ended up cramming everything into that applications array. Seems to be working. Now onto assets.

FYI, for anyone who finds this later, if you are using Elixir >= 1.4, you do not need to list your dependencies under the applications key anymore in mix.exs.

Leaving the applications key blank, mix will automatically infer your applications from your dependencies. See more details in 1.4 release notes: https://elixir-lang.org/blog/2017/01/05/elixir-v1-4-0-released

1 Like

For anyone who finds this even later, some dependencies just are not caught during release. I’m not sure what causes it but I’m guessing the way they are used in our codebase just causes mix to not detect that they are used, so in release mode it strips them out.

You never have to specify applications, but in cases where the lib is definitely missing you can put it in your extra_applications key in mix.exs.

def application do [extra_applications: [:logger, :sweet_xml]]
1 Like