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

Posted

技术标签:

【中文标题】使 elixir 应用程序在源代码更改时重新编译和重新加载【英文标题】:Make elixir app recompile and reload on source code change 【发布时间】:2015-12-09 00:46:33 【问题描述】:

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

如果 iex + mix 组合无法做到这一点,那么最简单的选择是什么?我检查了phoenix的reload方式,对于我的小测试项目来说实现起来似乎并不容易。

我也知道 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!

还有..请帮我在***上创建“iex”标签,我的名声不够:)

【问题讨论】:

我想我们在 elixir-lang-talk 邮件列表上对此进行了一些讨论。我认为甚至一些开源项目都是从中产生的……或者是为了混合 test.watch? 啊...是的,github上有几个项目,我会测试它们是否有效。 【参考方案1】:

我所知道的最接近的事情是@tonini 的 emacs 炼金术士。 在 Alchemist 中,有一个选项可以启用

(setq alchemist-hooks-test-on-save t)

这使它在您保存时编译并运行测试。

https://github.com/tonini/alchemist.el#testing

【讨论】:

【参考方案2】:

我认为这就是您要寻找的: https://github.com/AgilionApps/remix

【讨论】:

【参考方案3】:

对于 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.

您只想在您的开发环境中同步!

【讨论】:

我不认为这可以正常工作,因为:github.com/rustyio/sync/issues/56 @Michael Terry 是的,同样的问题。 这对长生不老药始终无效。无限循环***。【参考方案4】:

目前iex 有一个内部函数可以做到这一点:

iex 控制台内调用IEx.Helpers.recompile。

【讨论】:

你不需要输入完全限定的命令IEx.Helpers.recompile,只需运行recompile就足够了

以上是关于使 elixir 应用程序在源代码更改时重新编译和重新加载的主要内容,如果未能解决你的问题,请参考以下文章

如何在Elixir或Erlang中在运行时动态创建和加载模块?

在代码更改时重新编译页面

在文件更改时自动重新编译和重新加载服务器

为 elixir 项目编译牛仔时出现语法错误

在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?

尝试编译 argon2_elixir 时,nmake 失败