【问题标题】:Undefined function warnings during umbrella compilation伞形编译期间的未定义函数警告
【发布时间】:2018-02-09 21:34:39
【问题描述】:

我在伞形应用程序结构中遇到了一个奇怪的问题。当我在运行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 文件夹中定义的,那么它应该可供其他应用程序使用。

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

【问题讨论】:

  • 你在 application_a 中有依赖 {:application_b, in_umbrella: true} 吗?
  • 不,我想避免它。实际上是相反的,ApplicationB 将 ApplicationA 定义为伞式 dep:{:application_a, in_umbrella: true} 但我猜功能可用性不应该依赖于此。

标签: elixir umbrella


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!看起来是这样的:)
猜你喜欢
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2012-10-25
  • 2020-05-15
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多