Skip to content

Commit be7e656

Browse files
josevalimJosé Valim
authored and
José Valim
committed
Merge pull request #4453 from sasa1977/purge-erlang-modules-on-recompilation
purge erlang modules on recompilation Signed-off-by: José Valim <[email protected]>
1 parent c0770ba commit be7e656

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

lib/mix/lib/mix/tasks/compile.erlang.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ defmodule Mix.Tasks.Compile.Erlang do
8080

8181
Mix.Compilers.Erlang.compile(manifest(), tuples, fn
8282
input, _output ->
83+
# We're purging the module because a previous compiler (e.g. Phoenix)
84+
# might have already loaded the previous version of it.
85+
module = Path.basename(input, ".erl") |> String.to_atom
86+
:code.purge(module)
87+
:code.delete(module)
88+
8389
file = to_erl_file(Path.rootname(input, ".erl"))
8490
:compile.file(file, erlc_options)
8591
end)

lib/mix/test/mix/tasks/compile.erlang_test.exs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,25 @@ defmodule Mix.Tasks.Compile.ErlangTest do
5959
refute File.regular?("_build/dev/lib/sample/ebin/b.beam")
6060
end
6161
end
62+
63+
test "compilation purges the module" do
64+
in_fixture "compile_erlang", fn ->
65+
# Create the first version of the module.
66+
defmodule :purge_test do
67+
def version, do: :v1
68+
end
69+
assert :v1 == :purge_test.version
70+
71+
# Create the second version of the module (this time as Erlang source).
72+
File.write! "src/purge_test.erl", """
73+
-module(purge_test).
74+
-compile(export_all).
75+
version() -> v2.
76+
"""
77+
assert Mix.Tasks.Compile.Erlang.run([]) == :ok
78+
79+
# If the module was not purged on recompilation, this would fail.
80+
assert :v2 == :purge_test.version
81+
end
82+
end
6283
end

0 commit comments

Comments
 (0)