How to make a mix alias work differently in dev vs test?

My project has Mix aliases like this:

"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
"ecto.reset": ["ecto.drop", "ecto.setup"],

I’d like to skip the seeds.exs in :test (start with an empty db).

Here’s one way to do that:

# alias
"ecto.setup": &ecto_setup/1,

defp ecto_setup(_) do
  case Mix.env() do
    :test ->
      Mix.Task.run("ecto.create", ["--quiet"])
      Mix.Task.run("ecto.migrate_all", ["--quiet"])

    _ ->
      Mix.Task.run("ecto.create")
      Mix.Task.run("ecto.migrate_all")
      Mix.Tasks.Run.run(["priv/repo/seeds.exs"])
  end
end

Is there a simpler way?

def aliases(env \\ Mix.env())
def aliases(:dev) do
  ...
end
def aliases(:test) do
  ...
end
3 Likes

Oh, that’s nice. :slight_smile:

And I can still have some that are common across environments.

  defp aliases(env \\ Mix.env())

  defp aliases(:all_envs) do
    [
      # common ones
    ]
  end

  defp aliases(:dev) do
    aliases(:all_envs) ++
      [
        "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"]
      ]
  end

  defp aliases(:test) do
    aliases(:all_envs) ++
      [
        # skip seeds; start with empty database
        "ecto.setup": ["ecto.create", "ecto.migrate"]
      ]
  end
1 Like