ycherniavskyi
How to exclude a dependency's application from running but still Include it in the Release
I’m working on two Phoenix projects: A and B. Project B provides an HTTP API that is utilized by project A. Additionally, project B implements a Util module that project A uses. This is accomplished by adding project B as a dependency from GitHub to project A.
During development, I added the following dependency to project A:
defp deps do
[
# ...
{:a, app: false, github: "c/a", branch: "main"}
]
end
I used app: false to prevent loading and running the application from project B, allowing project A to only use the Util module from project B.
However, when I create a release of project A with MIX_ENV="prod" mix release, I encounter an error when executing ./_build/prod/rel/a/bin/a start:
(CompileError) _build/prod/rel/a/releases/0.1.0/runtime.exs:100: module RuntimeConfig is not loaded and could not be found
Upon inspecting the _build/prod/rel/a/lib directory, I noticed that the b dependency is missing.
What is the correct way to add project B as a dependency to project A for this specific use case? I would appreciate any advice or suggestions.
Marked As Solved
jchrist
I think an included application does what you describe. Roughly, in project A’s mix.exs, you want to set runtime: false for the dependency to B, then update your application config:
def application do
[
mod: {A.Application, []},
included_applications: [:b],
extra_applications: [:c, :d] # dependencies of :b that must be started for it to work
]
end
The release will then include :b but not automatically start it. Note that if you have :b as a dependency elsewhere, that may cause it to start regardless - you need to add runtime: false there as well, in that case.
Hope that helps ![]()
Also Liked
ycherniavskyi
That worked brilliantly! ![]()
I updated deps as follows:
defp deps do
[
# ...
{:a, github: "c/a", branch: "main", runtime: false}
]
end
and application by:
def application do
[
mod: {A.Application, []},
included_applications: [:b],
extra_applications: [:logger, :runtime_tools, :os_mon]
]
end
In my case, I didn’t need to add anything to extra_applications because I was only using one simple module from B , which didn’t require any additional applications.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









