I have an umbrella project that has lots of Phoenix apps, background workers, etc. Releases work great for deployment when you only want to start certain applications, but what about local dev using mix?
Given an umbrella like:
umbrella
apps
foo
foo_web
foo_worker
I’d like say something like iex -S mix app.start foo
and it not startup the foo_web
and foo_worker
apps.
I made my own custom mix task for this, but it requires compiling my app first, which is a bit wonky since most people I know just do mix deps.get; iex -S mix
and let the compile happen implicitly. Also, would be better to use something built-in than something custom.
Thanks for the help!
You can use:
$ mix run --no-start -e "{:ok, _} = Application.ensure_all_started(:foo)"
To start only one application. Just remember to add --no-halt
if you run it outside of IEx.
1 Like
I typically use mix cmd --app umbrella_child mix run
or pushd
/popd
for that, together with Tmux splits/panes, which can optionally be automated with projects like tmuxinator, teamocil, or a recent entrant called dmux.
Our primary repository at work is a large umbrella where most development efforts target one web frontend plus data and batch processing, so around a quarter of the total repo footprint, and this model works well in that scenario.
3 Likes
Nice, thanks for the mix command!
We use tmuxinator also, but I’m not entirely happy with it, thanks for those alternatives, going to check them out.
How do you use pushd
and popd
, I’m not getting that part.
pushd
and popd
are named after pushing and popping a stack from traditional computer science, so it looks something like:
# stores your current working directory
pushd apps/umbrella_child
# one-off commands, this approach doesn't work as well for something that stays running
mix ecto.migrate
# restores your working directory as it was prior to the previous pushd command
popd
1 Like