依赖项中的Ecto配置

时间:2016-04-20 18:04:51

标签: configuration dependencies elixir ecto mix

我有两个mix项目P1和P2。

P1依赖于ecto并提供genserver接口。它还作为P2中的依赖项添加,仅用于访问某些客户端功能。因此P2不会尝试启动P1。它是独立开始的。

问题是P2无法编译。 mix compile表示缺少P1.Repo的适配器配置。

我不想在P2中包含P1的任何repo配置。在这些情况下,有没有办法在P2内使用P1的模块提供的功能?

2 个答案:

答案 0 :(得分:1)

这是特定于Ecto的,但是在将模块定义为repo时可以提供编译时配置。

defmodule MyApp.Repo do
  use Ecto.Repo, otp_app: :my_app,
                 adapter: Ecto.Adapters.Postgres
end

然后,您可以在repo的init/2回调中添加运行时配置。

defmodule MyApp.Repo do
  use Ecto.Repo, otp_app: :my_app,
                 adapter: Ecto.Adapters.Postgres

  def init(_type, config) do
    new_config = Keyword.put(config, :url, System.get_env("DATABASE_URL"))

    {:ok, new_config}
  end
end

更通用的解决方案是将应用程序配置作为mix.exs :env选项的一部分提供。我相信这只是运行时间(如果我错了,有人请纠正我。)

这是mix help compile.app提供的内容。

  

:env - 应用程序环境的默认值。应用程序       环境是配置应用程序的最常用方法之一。看到       应用程序模块,用于读取和写入应用程序的机制       环境。

以下application/0使用mix.exs :env中的def application do [extra_applications: [:logger, :crypto], env: [key: :value], registered: [MyServer]] end 示例。

in

答案 1 :(得分:0)

如果P1是P2的依赖关系,P2负责配置,没有任何东西可以改变,但你还有其他几个选择:

  • 使用umbrella project伞形项目可以拥有自己的配置P1.Repo。这样可以保持P1和P2配置更清洁。

  • 另外,您可以从P1中删除有意义的块,然后将其移至P3。 P1和P2都依赖于P3。