Emacs中的Elixir:UndefinedFunctionError:模块不可用

时间:2014-12-12 13:42:16

标签: emacs elixir

我创建了一个混合项目并且为了学习目的,我将所有三个文件放在lib文件夹中:Client1.ex,Client2.ex和MyLibrary.ex。 我在Client1.ex和Client2.ex

中有相同的代码
defmodule Project.Client1
#nothing
end
IO.puts(inspect(Project.MyLibrary.myFunc()))

当我使用alchemist-compile-this-buffer在emacs中运行此代码时,上述代码适用于Client1,但不适用于Client2。我收到了错误

elixirc /Users/../lib/Client2.ex
lib/Client2.ex:1: warning: redefining module Project.Client2


== Compilation error on file lib/Client2.ex ==
** (UndefinedFunctionError) undefined function: Project.MyLibrary.myFunc/0 (module Project.MyLibrary is not available)
    Project.MyLibrary.myFunc()
    lib/Client2.ex:10: (file)
    (elixir) lib/kernel/parallel_compiler.ex:95: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/8

我观察到的事情:

  • 运行混合编译适用于Client2

  • Client2.beam不会像其他人一样在lib文件夹中创建BUT位于包含lib文件夹的项目根文件夹中。

2 个答案:

答案 0 :(得分:3)

感谢您使用Alchemist,让我试着帮助您解决遇到的问题。

alchemist-compile-this-buffer函数是alchemist-compile模块的一部分。 alchemist-compile模块会使用elixirc运行所有编辑,并始终位于default-directory所在的current-buffer-filealchemist-compile带来了在基于mix的项目之外编译动态单个文件的功能。因此,BEAM文件始终位于default-directorycurrent-buffer-file所在的位置。

因此,在您的情况下以及使用mix创建新的Elixir项目时,您始终需要使用alchemist-mix模块。运行alchemist-mix-compile的{​​{1}}将在Elixir项目的上下文中运行编译,并将mix compile个文件放在Elixir项目根目录的BEAM目录下。< / p>

我希望这个解释可以帮助你。

如果您有更多问题,请在Freenode上的#elixir-lang IRC频道给我打电话。你可以放弃消息,我总是连接。 ; - )

我的用户名是:tonini

干杯

塞缪尔

答案 1 :(得分:-1)

出于某种原因,Client2.beam是由alchemist-compile-this-buffer在项目根文件夹中创建的。由于我是黑客,我不记得确切的步骤,但

  • 我删除了Client2.beam,
  • defmodule Client2重命名为defmodule Client2_tmp
  • 再次跑alchemist-compile-this-buffer。有效。在lib /
  • 中创建的梁文件
  • 将模块重命名为Client2并再次运行alchemist-compile-this-buffer

是的,我觉得自己像是一个B.F Skinner实验中的鸽子。我希望能再次参加另一场赛鸽舞会。