【问题标题】:How can i run ecto migrations of a dependency?如何运行依赖项的 ecto 迁移?
【发布时间】:2018-05-13 02:52:09
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 如果这是一个伞形应用程序,我只需 cd 进入核心项目并运行迁移。您还可以将核心项目中的迁移复制到您需要它们的每个项目中。可能值得创建一个混合任务来执行此操作。
  • 您能给我们提供更多关于您的项目结构的信息吗?具体来说,你如何处理你的依赖关系?您使用伞式应用程序,还是将它们作为 deps 包含在单独的包中?
  • 不,这不是 Umbrella 应用程序,我只是将依赖项添加到我的混合文件中,该文件是从 git 获取的。我认为制作 Umbrella 应用程序没有意义,因为将使用核心项目的项目没有以任何方式连接。 :)

标签: elixir ecto


【解决方案1】:

您应该能够在自定义任务中使用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

【讨论】:

    【解决方案2】:

    您还可以通过定义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 应用程序获取迁移,并使用您应用程序的配置和存储库)。

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 2016-08-17
      • 2016-08-11
      • 2020-06-22
      • 2016-08-13
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多