我创建了一个混合项目并且为了学习目的,我将所有三个文件放在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文件夹的项目根文件夹中。
答案 0 :(得分:3)
感谢您使用Alchemist,让我试着帮助您解决遇到的问题。
alchemist-compile-this-buffer
函数是alchemist-compile
模块的一部分。
alchemist-compile
模块会使用elixirc
运行所有编辑,并始终位于default-directory
所在的current-buffer-file
。 alchemist-compile
带来了在基于mix
的项目之外编译动态单个文件的功能。因此,BEAM
文件始终位于default-directory
和current-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
在项目根文件夹中创建的。由于我是黑客,我不记得确切的步骤,但
defmodule Client2
重命名为defmodule Client2_tmp
alchemist-compile-this-buffer
。有效。在lib / alchemist-compile-this-buffer
。是的,我觉得自己像是一个B.F Skinner实验中的鸽子。我希望能再次参加另一场赛鸽舞会。