让Elixir应用程序在源代码更改时重新编译和重新加载

29

如何在修改源代码时自动重新编译和重新加载我的iex + mix应用程序?

如果iex + mix组合没有这样做的方法,那么最简单的替代方案是什么?我已经检查了Phoenix的重新加载方式,但对于我的小型测试项目来说,似乎不容易实现。

我还知道José的.iex.exs

defmodule R do
  def reload! do
    Mix.Task.reenable "compile.elixir"
    Application.stop(Mix.Project.config[:app])
    Mix.Task.run "compile.elixir"
    Application.start(Mix.Project.config[:app], :permanent)
  end
end

我并不是非常开心,因为代码改变后它没有自动重新加载,我仍然需要在iex上输入R.reload!

还有...请帮我在stackoverflow上创建"iex"标签,我的声誉不够 :)


我记得我们在elixir-lang-talk邮件列表上讨论过这个问题。我觉得甚至有一些开源项目源自于这次讨论... 还是说这是为了mix test.watch? - José Valim
啊...是的,Github 上有几个项目,我会测试并回来看它们是否可用。 - ardhitama
5个回答

15

13

当前,iex内部已经有一个函数来完成这个操作:

iex控制台中调用IEx.Helpers.recompile


2
你不需要输入完整的命令 IEx.Helpers.recompile,只需运行 recompile 即可。 - Zoltán
你可以只执行iex> r My.Module - eddy147

3
我知道的最接近的东西是由@tonini开发的Emacs Alchemist插件。在Alchemist中,有一个选项可以启用。
(setq alchemist-hooks-test-on-save t)

使得当你保存时,它会进行编译并运行测试。 https://github.com/tonini/alchemist.el#testing

1

1
对于Erlang,我使用"relx -d"和https://github.com/rustyio/sync一起使用。"-d"表示源文件使用符号链接进行链接。
在Elixir中同样适用。在mix.exs中,我在以下两个位置添加了:sync。
  defp deps do
        [{:sync, git: "https://github.com/rustyio/sync.git", tag: "master"}, ....


  def application do
    [applications: [:logger, :sync],

然后,以下命令将其编译为发布版本(在使用之前,您将需要安装hex和exrm)。
mix release -dev

现在,当您更改.ex文件并保存时,它将被重新编译并直接加载。
19:33:46.474 [info]  ... /apps/testapp1/lib/kv/bucket.ex:0: Recompiled.

你只想在开发环境中同步!

1
我认为这可能无法正常工作,原因是:https://github.com/rustyio/sync/issues/56 - Michael Terry
1
@Michael Terry 是的,我这里也有同样的问题。 - Doodloo
1
这在 Elixir 中不一致地工作。无限循环狂热。 - CallMeNorm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接