【问题标题】:How do I use a module defined in lib/ folder of Phoenix project?如何使用 Phoenix 项目的 lib/ 文件夹中定义的模块?
【发布时间】:2017-01-12 02:11:08
【问题描述】:

我在lib/ 中创建了一个模块,更具体地说是lib/my_namespace/test_module.exs

这就是其中定义的全部内容:

defmodule MyNamespace.TestModule do
  def test do
    "This is a test"
  end
end

在 Phoenix 控制器中调用此模块的 test() 函数会导致错误。

** (UndefinedFunctionError) function MyNamespace.TestModule.test/0 is undefined (module MyNamespace.TestModule is not available)
    MyNamespace.TestModule.test()

根据Elixir 1.2.0 Changelog,据我了解,Elixir 旨在重新加载lib/ 目录中的代码,所以我的假设是我不需要做任何其他事情。

我显然错了,我自己的研究并没有产生任何有希望的结果。我收集到的唯一一件事是我的模块没有进入?loadpath?而且我不确定要更改什么,所以它在加载路径上。

有人能帮我指出我应该阅读哪些文档的方向吗?

提前致谢。

【问题讨论】:

  • 尝试将文件从.exs重命名为.ex
  • 谢谢@Dogbert。那行得通。你知道我在哪里可以阅读到任何文档中的这个约定吗?如果是这样,你能和我分享一下吗?另外,请提交答案,以便我将其标记为正确。再次感谢!
  • 不幸的是,我找不到比 elixir-lang.org/getting-started/modules.html#scripted-mode 更好的东西(它没有提到 mix 不编译 .exs 文件)。

标签: module elixir phoenix-framework autoload load-path


【解决方案1】:

.exs files are meant for scripting 并且mix 与项目的其余部分一起编译为字节码。如果您希望能够从您的应用程序访问其中定义的模块,您应该将 lib/my_namespace/test_module.exs 重命名为 lib/my_namespace/test_module.ex

【讨论】:

  • @John 编译为字节码的模块可以被其他编译的代码或脚本自动加载,只需将它们放在 Erlang 的“代码路径”中(参见“代码路径”heremix 自动执行此操作对于当前包及其所有依赖项)。由于默认情况下脚本不会编译为字节码,因此它们在其他地方不可用,除非您在运行时评估它们 (Code.eval_file) 或以某种方式将它们编译为字节码并将其放置在代码路径中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2020-08-22
  • 2022-06-30
相关资源
最近更新 更多