Экто конфиг в зависимостях

У меня есть два проекта mix P1 и P2.

P1 зависит от ecto и предоставляет интерфейс genserver. Он также добавлен как зависимость в P2 только для доступа к некоторым клиентским функциям. Таким образом, P2 не пытается запустить P1. Запускается самостоятельно.

Проблема в том, что P2 не может быть скомпилирован. mix compile говорит, что конфигурация адаптера для P1.Repo отсутствует.

Я не хочу включать какую-либо конфигурацию репо для P1 внутри P2. Есть ли способ использовать функциональные возможности, предоставляемые модулями P1 внутри P2 в этих обстоятельствах?


person zobel    schedule 20.04.2016    source источник


Ответы (2)


Это специфично для Ecto, но вы можете указать конфигурацию времени компиляции при определении модуля как репозитория.

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

Затем вы можете добавить конфигурацию времени выполнения в обратный вызов репо 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

Более общим решением было бы предоставить конфигурацию приложения как часть опции :env mix.exs. Я считаю, что это только время выполнения (кто-то, пожалуйста, поправьте меня, если я ошибаюсь).

Вот что mix help compile.app сообщает по этому поводу.

:env — значения по умолчанию для среды приложения. Среда приложений — один из наиболее распространенных способов настройки приложений. См. модуль Application для механизмов чтения и записи в среду приложения.

Вот пример application/0 в mix.exs с использованием :env.

def application do
  [extra_applications: [:logger, :crypto],
   env: [key: :value],
   registered: [MyServer]]
end
person anthonator    schedule 05.06.2018

Если P1 является зависимостью P2, P2 отвечает за конфигурацию, и ничто не может это изменить, но у вас есть несколько других вариантов:

  • используйте зонтичный проект Зонтичный проект может иметь собственную конфигурацию с P1.Repo. Таким образом, вы сохраняете конфигурации P1 и P2 более чистыми.

  • кроме того, вы можете вырвать значимый фрагмент из P1, который используется P2, и переместить его на P3. И P1, и P2 зависят от P3.

person tkowal    schedule 21.04.2016