【问题标题】:Run migration command twice inside aliases in mix file在混合文件的别名内运行迁移命令两次
【发布时间】:2019-11-13 19:11:22
【问题描述】:

在 mix 文件中的别名中。如果我们这样定义迁移命令:

 defp aliases do
  [
    "ecto.migrate": [
      "ecto.migrate  data/priv/repo/migrations",
      "ecto.migrate --migrations-path apps/al/priv/repo/migrations"
     ]
  ]

如果我们运行mix ecto.migrate。只有第一个命令被执行,第二个被忽略。

我知道 mix 不允许两次运行相同的任务。而且我认为Mix.task.rerun or reenable 不会在这里工作,因为它不是自定义任务。

有什么办法可以覆盖它,这样两个命令都会执行吗?

【问题讨论】:

  • 当然,这是一个自定义任务,因此Mix.task.rerun 可以工作。 ecto 任务没有什么特别之处,它们与你的任务相同:)
  • @AlekseiMatiushkin 感谢您的建议。我试过Mix.task.rerun "ecto.migrate --migration_path"。但它给了task not defined error。您能否请您详细说明在答案中使用它的正确方法。谢谢

标签: elixir phoenix-framework elixir-mix


【解决方案1】:

我不知道有什么方法可以从 Mix.Project 重新运行任务,但您可以轻松创建自己的任务以满足您的需求。

cat lib/mix/tasks/my_migrate.ex
defmodule Mix.Tasks.MyApp.MyMigrate do
  @shortdoc "Executes `ecto.migrate` several times for different paths"

  use Mix.Task

  @impl Mix.Task
  def run(paths) do
    Enum.each(paths, fn path ->
      Mix.shell().info("Executing Ecto.Migrate for path: " <> path)
      Mix.Tasks.Ecto.Migrate.run(migrations_path: path)
      Mix.Task.reenable(Mix.Tasks.Ecto.Migrate)
    end)
  end
end

然后运行它

mix my_app.my_migrate "data1/migrations" "data2/migrations"

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2020-10-24
    • 2018-08-18
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多