我有两个mix
项目P1和P2。
P1依赖于ecto并提供genserver接口。它还作为P2中的依赖项添加,仅用于访问某些客户端功能。因此P2不会尝试启动P1。它是独立开始的。
问题是P2无法编译。 mix compile
表示缺少P1.Repo
的适配器配置。
我不想在P2中包含P1的任何repo配置。在这些情况下,有没有办法在P2内使用P1的模块提供的功能?
答案 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。