0

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

有谁知道如何摆脱警告,更重要的是 - 解释一下?:)

4

1 回答 1

3

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

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

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

于 2018-02-09T13:34:39.677 回答