伞形编译期间未定义的函数警告

Undefined function warnings during umbrella compilation

我在我的伞式应用程序结构中遇到了一个奇怪的问题。当我在 运行 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 被定义并且它是 public。当我 运行 交互式 shell 中伞级别的项目时,一切正常,我可以手动调用该函数,它按预期工作。 我一直在尝试进行研究,据我所知,ApplicationB 的功能应该可用于 ApplicationA,因为两者都在同一个保护伞内,无需将它们添加到 deps 列表中。如果该函数定义在我的 application_b 的 /lib 文件夹中,它应该可供其他应用程序使用。

有没有人知道如何消除警告,更重要的是 - 解释一下? :)

我相信您在 B 中使用了来自 A 的宏,反之亦然。 Elixir 编译器按顺序构建模块,需要将所有宏扩展为真正的 AST。在一个应用程序中,交叉依赖甚至可能会破坏构建。

但是当两个应用程序具有交叉依赖性时,Elixir 编译器会假设该函数可能在满足依赖性并构建所有内容并且错误已降级为警告后可用。

要消除此警告,如果您绝对肯定确实定义了这样的函数,请使用Kernel.apply/3而不是显式调用。