我如何 运行 ecto 依赖项的迁移?

How can i run ecto migrations of a dependency?

我正在构建一个项目,它将作为多个其他项目的核心,有点像 ruby 世界中的 Rails 引擎。

我在我的核心项目中实现了一些基础数据库结构,基本上是全盘共享的结构。

我的问题是使用我的核心的项目没有注册核心项目的迁移。

有什么方法可以 运行 迁移我的核心依赖项?

如果您需要更多信息,请告诉我。 :-)

谢谢

您应该能够在自定义任务中使用 Ecto.Migrator 模块。 有关更详细的说明,请参阅 running-migration-in-an-exrm-release

defmodule Release.Tasks do
  def migrate do
    {:ok, _} = Application.ensure_all_started(:my_dependency)

    path = Application.app_dir(:my_dependency, "priv/repo/migrations")

    Ecto.Migrator.run(MyApp.Repo, path, :up, all: true)

    :init.stop()
  end
end

您还可以通过定义 Mix.Tasks.* 模块来创建混合任务来帮助您,如下所示:

defmodule Mix.Tasks.DependencyApp.Ecto.Migrate do

  use Mix.Task
  alias MyApp.Repo

  def run(args) do
    path = Application.app_dir(:dependency_app, "priv/repo/migrations")
    {:ok, pid, apps} = Mix.Ecto.ensure_started(Repo, [])
    Ecto.Migrator.run(Repo, path, :up, all: true)
    Repo.stop(pid)
  end

end

这将使您 运行 mix dependency_app.ecto.migrate(从 dependency_app 应用程序进行迁移,并使用您应用程序的配置和存储库)。