使 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中在运行时动态创建和加载模块?