Mix task to start only certain applications?

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.

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.

2 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