Неопределенные предупреждения функции во время компиляции зонтика

Я столкнулся со странной проблемой в структуре моего зонтичного приложения. Когда я собираю весь проект после запуска mix clean Команда, я получаю следующее предупреждение от application_a:

function ApplicationB.ModuleName.function_name/0 is undefined (module 
ApplicationB.ModuleName is not available)
  lib/file_name.ex:13`

Дело в том, что модуль есть, ApplicationB.ModuleName.function_name/0 определяется, и это публично. Когда я запускаю проект с уровня зонтика в интерактивной оболочке, все работает нормально, я могу вызвать функцию вручную и она работает как положено. Я пытался провести исследование, и, насколько я понимаю, функция ApplicationB должна быть доступна для ApplicationA, так как оба находятся в одном зонтике, и нет необходимости добавлять их в список deps. Если функция определена в папке my /lib в application_b, она должна быть доступна для остальных приложений.

У кого-нибудь есть идея, как избавиться от предупреждения, и что важнее - объяснить это?:)

1 ответ

Решение

Я полагаю, у вас есть макросы из A используется в B и наоборот. Компилятор Elixir собирает модули в порядке, необходимом для расширения всех макросов до реального AST. Внутри одного приложения взаимозависимости могут даже нарушить сборку.

Но когда два приложения имеют взаимозависимости, компилятор Elixir делает предположение, что функция может стать доступной после того, как зависимости будут выполнены, и все будет построено, а ошибка понижена до предупреждения.

Чтобы избавиться от этого предупреждения, если вы абсолютно уверены, что такая функция действительно определена, используйте Kernel.apply/3 вместо явного вызова.

Другие вопросы по тегам