Elixir 1.10.2 / Phoenix 1.5 после изменения шаблона часто получает сообщение «невозможно определить модуль ... потому что он в настоящее время определяется в» (середина 2020 г.) - PullRequest
0 голосов
/ 06 августа 2020

Я все еще часто получаю эту ошибку, используя последнюю версию elixir / phoenix, так что это не то же самое, что ошибка, исправленная в Elixir v1.0.3 и описанная здесь: В Elixir / Phoenix после изменения шаблона "не может определить модуль MyApp.PageView, потому что он в настоящее время определяется "

Запуск mix.compile в другом терминале выявляет ошибку, в данном случае это был шаблон слизи.:

** (TokenMissingError) lib/tealdog_web/templates/workspace/_row_controls_center.html.sleex:30: missing terminator: " (for string starting at line 27)
    (eex 1.10.2) lib/eex/compiler.ex:45: EEx.Compiler.generate_buffer/4
    (phoenix 1.5.4) lib/phoenix/template.ex:351: Phoenix.Template.compile/3
    (phoenix 1.5.4) lib/phoenix/template.ex:166: anonymous fn/4 in Phoenix.Template."MACRO-__before_compile__"/2
    (elixir 1.10.2) lib/enum.ex:2111: Enum."-reduce/3-lists^foldl/2-0-"/3
    (phoenix 1.5.4) expanding macro: Phoenix.Template.__before_compile__/1
    lib/tealdog_web/views/workspace_view.ex:1: TealdogWeb.WorkspaceView (module)
    (elixir 1.10.2) lib/kernel/parallel_compiler.ex:304: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/7

Я не уверен, что это c для слизи или нет. Я не заметил никаких проблем в списке проблем slime-lang на GitHub (https://github.com/slime-lang/phoenix_slime/issues).

Это довольно распространенная проблема, которая НЕ решается во многих случаях и трудно воспроизвести. Есть ли у кого-нибудь фикс?

  defp deps do
    [{:phoenix, "~> 1.5.3"},
      ...
      {:phoenix_slime, "~> 0.13.1"},
      ...]

Эликсир версия 1.10.2, ОПТ 21

elixir -v
Erlang/OTP 21 [erts-10.3.4] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe]

Elixir 1.10.2 (compiled with Erlang/OTP 21)

1 Ответ

1 голос
/ 06 августа 2020

Эта ошибка возникает в основном в двух случаях:

  • есть динамические c перекрестные ссылки между модулями, которые не могут быть разрешены графом зависимостей компилятора, или
  • некоторая библиотека / код создает модуль (ы) на лету с Module.create/3 и написан недостаточно точно для обработки этого

В таких случаях порядок файлов для компиляции является случайным и следовательно, вы испытываете это ненадежное поведение. Единственное исправление, которое я мог бы предложить, - это явно потребовать какой-то другой модуль из модуля problemati c, чтобы обеспечить порядок компиляции (с alias или подобным.)

Кроме того, используя boundary* Библиотека 1017 * может упростить обнаружение источника ошибки.

...