адаптер Ecto.Adapters.Postgres не был скомпилирован

Я не могу создать свой проект Phoenix. Очень хотелось бы несколько советов о том, как это исправить.

Детали настройки:

  • Ubuntu 16.04.4 LTS
  • Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp: 1:1] [ds: 1:1: 10] [async-threads: 1] [hipe]
  • Эликсир 1.7.3 (скомпилировано с Erlang/OTP 20)
  • Mix 1.7.3 (составлено с Erlang/OTP 20)
  • Ecto v3.0.0

Я слежу за Phoenix Up and Running, чтобы сделать приложение.

mix phx.new hello
cd hello
mix ecto.create

Последняя команда дает мне:

 == Compilation error in file lib/hello/repo.ex ==
 ** (ArgumentError) adapter Ecto.Adapters.Postgres was not compiled, ensure it is correct and it is included as a project dependency
     lib/ecto/repo/supervisor.ex:71: Ecto.Repo.Supervisor.compile_config/2
     lib/hello/repo.ex:2: (module)
     (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
     (elixir) lib/kernel/parallel_compiler.ex:206: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6

У меня установлен postgres. У меня есть супер пользователь postgres.

Ответы

Ответ 1

Есть ли у вас phoenix_ecto 3.5.0 в ваших зависимостях? Понижение до 3.4.0 работало для меня как временное исправление, пока я не выяснил основную проблему.

Чтобы вызвать понижение рейтинга:

  1. Запустите mix deps.clean --all
  2. Удалите файл mix.lock
  3. Обновите ваш файл mix.exs ограничив версию phoenix_ecto. Найдите соответствующую строку и замените на: {:phoenix_ecto, ">= 3.2.0 and < 3.5.0"},
  4. Запустите mix deps.get

В качестве альтернативы, если вы только начинаете использовать Phoenix, вы можете использовать версию 1.4 для изучения, которая скоро будет выпущена и не будет иметь этой проблемы.

Сначала удалите свой текущий локальный архив Феникса:

mix archive.uninstall phx_new

Затем, чтобы установить последнюю версию разработки, следуйте инструкциям в https://github.com/phoenixframework/phoenix/blob/master/installer/README.md

Ответ 2

Начиная с Ecto 3.0, Ecto.Adapters.Postgres не поставляется с Ecto по умолчанию, поэтому вы должны добавить ecto_sql к зависимостям Mixfile:

###########
# mix.exs #
###########
defp deps do
  [
    # (...)
    {:ecto_sql, "~> 3.0-rc.1"},
    {:postgrex, ">= 0.0.0"}
  ]
end

# Feeling skittish about dependencies, 
# I usually do this instead of simply 
# doing 'mix deps.get':

$ mix deps.clean --all
$ mix do deps.get, compile

(Дерево Ecto github repo v3.0.0 рекомендует {:ecto_sql, "~> 3.0"}, но последний выпуск - 3.0.0-rc.1), поэтому на данный момент оно не будет работать. Интересно, что в репо 3.0.0-rc.1 тега 3.0.0-rc.1, но документация уже ссылается на это, и он также работает со mix.)

... или, как Юфренд рекомендует в своем ответе, если вы начинаете новый проект Phoenix, используйте пакеты <1.4.0.


См. Серию статей Хосе Валима "Проникновение в Ecto 3.0", где в первом посте рассказывается о переломных изменениях в Ecto 3.0:

Сплит Ecto в ecto и ecto_sql

Экто 3.0 будет сломана в двух местах хранения: ecto и ecto_sql. Начиная с Ecto 2.0, все большее число разработчиков и команд используют Ecto для отображения и проверки данных без необходимости в базе данных. Тем не менее, добавление Ecto в ваше приложение все равно принесет большой багаж SQL, такой как адаптеры, песочницы и миграции, что многие считают смешанным сообщением.

В Ecto 3.0 мы переместим все адаптеры SQL в отдельный репозиторий, а Ecto сосредоточится на четырех строительных блоках: схемах, наборах изменений, запросах и репозиториях. Вы можете увидеть обсуждение в трекере вопросов.

Если вы используете Ecto с базой данных SQL, переход на Ecto 3.0 будет очень простым. Вместо:

{:ecto, "~> 2.2"}

Вы должны перечислить:

{:ecto_sql, "~> 3.0"}

И если вы используете Ecto только для манипулирования данными, но без доступа к базе данных, то это просто вопрос повышения его версии. Это оно!


ОБНОВИТЬ

По какой-то причине мне также нужно было добавить {:plug_cowboy, "~> 1.0"} к зависимостям Mixfile при обновлении проекта Phoenix 1.3, и все это начало работать.

Ответ 3

Установка новой версии Phoenix работала на меня.

Удалить старую версию:

mix archive.uninstall phx_new

Установите новую версию:

mix archive.install hex phx_new 1.4.0-rc.2

Ответ 4

Новые проекты

Для создания новых проектов с Ecto 3.0 настоятельно рекомендуется выполнить обновление до нового установщика phoenix 1.4.x:

$ mix archive.uninstall phx_new
$ mix archive.install hex phx_new 1.4.0-rc.2

Существующие проекты

Чтобы обновить существующие проекты Phoenix 1.3.x до версии 1.4, ознакомьтесь с Официальным руководством по обновлению и прилагаемым объявлением.

TL;DR состоит в том, что Ecto был разбит на подпакеты, и вам необходимо указать их явно:

Удалите Явный :ecto зависимость и обновить :phoenix_ecto и :ecto_sql зависимости со следующими версиями:

{:ecto_sql, "~> 3.0-rc"},
{:phoenix_ecto, "~> 4.0"},