我目前正在通过elixer-lang网站上的OTP和mix教程学习Elixir技术,但我在尝试从shell内部重新编译和重新加载项目时遇到了麻烦。
在Erlang中,我会使用make:all([load])
重新编译并加载任何更改。 但是,在iex
中,它总是显示:up_to_date
,这是有道理的,因为Elixir使用mix进行编译。
我找不到在iex中的任何等效命令。
我目前正在通过elixer-lang网站上的OTP和mix教程学习Elixir技术,但我在尝试从shell内部重新编译和重新加载项目时遇到了麻烦。
在Erlang中,我会使用make:all([load])
重新编译并加载任何更改。 但是,在iex
中,它总是显示:up_to_date
,这是有道理的,因为Elixir使用mix进行编译。
我找不到在iex中的任何等效命令。
IEx.Helpers.recompile/0
函数。mix.exs
或配置文件的更改将不会被捕获。对于这种情况,需要重新启动shell和Mix。r ModuleName
。c("filename.ex")
会和@Dogbert一样工作吗?只是好奇。 - Onorio Catenacci2017年2月26日:
要在一个正在运行的Elixir系统中以最低的出错几率热加载组件,请使用以下方法:
case c(filename_ex, :in_memory) do
[] -> :ignore
[mod|_] -> r(mod)
end
在 Elixir 1.3.0 中,重新编译不再重新启动应用程序。因此,检查是否有任何源更改并进行热加载的正确方法是:iex> recompile()
注意:由于重新编译过程中移除模块存在问题,如果您的操作中有未完成的消息(如具有状态超时的gen_statem),则在重新编译时很可能会导致进程崩溃。
注意2:如果您在源文件中出现错误,使用recompile/0,该项目将在缺少和未加载该源文件的情况下编译。
def recompile() do
Mix.Task.reenable("app.start")
Mix.Task.reenable("compile")
Mix.Task.reenable("compile.all")
compilers = Mix.compilers
Enum.each compilers, &Mix.Task.reenable("compile.#{&1}")
Mix.Task.run("compile.all")
end
MyApp.recompile
,而无需重新启动应用程序即可进行热重载。[:noop, :noop]
。 - Mr H
iex
中尝试过r/1
吗?请注意,您可以通过调用h()
在iex
中调用帮助。看看周围是否有一些可以帮助您的东西。 - Guedesr/1
,但那仍然不等同于make:all([load])
。我必须手动输入我已更新代码的每个模块,而make:all([load])
可以自动检测更新的模块并重新编译/加载它们。 - KallDrexx