diff options
author | José Valim <jose.valim@plataformatec.com.br> | 2018-12-14 21:25:24 +0100 |
---|---|---|
committer | José Valim <jose.valim@plataformatec.com.br> | 2018-12-14 21:31:36 +0100 |
commit | 85ca87f1edec433eb016de89b228d242b89dc337 (patch) | |
tree | 030bbaca406051ac08d24783fa66dd8b5de0f069 | |
parent | f244ee310fb39a57eae05295eeea08346b5533d4 (diff) | |
download | elixir-85ca87f1edec433eb016de89b228d242b89dc337.tar.gz |
Ensure changes in deps propagate to all umbrella children
This fix a long standing issue where users would have to
delete _build after updating a dependency to recompile.
This is done by a currently private and recursive task
called will_recompile.
-rw-r--r-- | lib/mix/lib/mix/dep/lock.ex | 23 | ||||
-rw-r--r-- | lib/mix/lib/mix/project.ex | 4 | ||||
-rw-r--r-- | lib/mix/lib/mix/tasks/deps.compile.ex | 2 | ||||
-rw-r--r-- | lib/mix/lib/mix/tasks/will_recompile.ex | 23 | ||||
-rw-r--r-- | lib/mix/test/mix/tasks/will_recompile_test.exs | 27 |
5 files changed, 54 insertions, 25 deletions
diff --git a/lib/mix/lib/mix/dep/lock.ex b/lib/mix/lib/mix/dep/lock.ex index d6279fa36..e92fdafe4 100644 --- a/lib/mix/lib/mix/dep/lock.ex +++ b/lib/mix/lib/mix/dep/lock.ex @@ -5,27 +5,6 @@ defmodule Mix.Dep.Lock do @moduledoc false - @manifest "compile.lock" - - @doc """ - Returns the manifest file for dependencies. - - The manifest is used to check if the lockfile - itself is up to date. - """ - def manifest(path \\ Mix.Project.manifest_path()) do - Path.join(path, @manifest) - end - - @doc """ - Touches the manifest file to force recompilation. - """ - def touch_manifest do - path = Mix.Project.manifest_path() - File.mkdir_p!(path) - File.touch!(manifest(path)) - end - @doc """ Reads the lockfile, returns a map containing each app name and its current lock information. @@ -57,7 +36,7 @@ defmodule Mix.Dep.Lock do end File.write!(lockfile(), ["%{\n", lines, "}\n"]) - touch_manifest() + Mix.Task.run("will_recompile") end :ok diff --git a/lib/mix/lib/mix/project.ex b/lib/mix/lib/mix/project.ex index 3f5b3e46b..a3e576091 100644 --- a/lib/mix/lib/mix/project.ex +++ b/lib/mix/lib/mix/project.ex @@ -207,7 +207,7 @@ defmodule Mix.Project do """ @spec config_files() :: [Path.t()] def config_files do - [Mix.Dep.Lock.manifest() | Mix.ProjectStack.config_files()] + [Mix.Tasks.WillRecompile.manifest() | Mix.ProjectStack.config_files()] end @doc """ @@ -220,7 +220,7 @@ defmodule Mix.Project do @doc since: "1.7.0" @spec config_mtime() :: posix_mtime when posix_mtime: integer() def config_mtime do - Mix.Dep.Lock.manifest() + Mix.Tasks.WillRecompile.manifest() |> Mix.Utils.last_modified() |> max(Mix.ProjectStack.config_mtime()) end diff --git a/lib/mix/lib/mix/tasks/deps.compile.ex b/lib/mix/lib/mix/tasks/deps.compile.ex index 3567e35ba..e59973c02 100644 --- a/lib/mix/lib/mix/tasks/deps.compile.ex +++ b/lib/mix/lib/mix/tasks/deps.compile.ex @@ -101,7 +101,7 @@ defmodule Mix.Tasks.Deps.Compile do compiled? and fetchable? end) - if true in compiled, do: Mix.Dep.Lock.touch_manifest(), else: :ok + if true in compiled, do: Mix.Task.run("will_recompile"), else: :ok end defp maybe_clean(dep, opts) do diff --git a/lib/mix/lib/mix/tasks/will_recompile.ex b/lib/mix/lib/mix/tasks/will_recompile.ex new file mode 100644 index 000000000..303a5fe95 --- /dev/null +++ b/lib/mix/lib/mix/tasks/will_recompile.ex @@ -0,0 +1,23 @@ +defmodule Mix.Tasks.WillRecompile do + use Mix.Task + + @moduledoc false + @recursive true + @manifest "compile.lock" + + @doc """ + Returns the will_recompile manifest for the project. + """ + def manifest(path \\ Mix.Project.manifest_path()) do + Path.join(path, @manifest) + end + + @doc """ + Annotates the current project will recompile. + """ + def run(_) do + path = Mix.Project.manifest_path() + File.mkdir_p!(path) + File.touch!(manifest(path)) + end +end diff --git a/lib/mix/test/mix/tasks/will_recompile_test.exs b/lib/mix/test/mix/tasks/will_recompile_test.exs new file mode 100644 index 000000000..206195049 --- /dev/null +++ b/lib/mix/test/mix/tasks/will_recompile_test.exs @@ -0,0 +1,27 @@ +Code.require_file("../../test_helper.exs", __DIR__) + +defmodule Mix.Tasks.WillRecompileTest do + use MixTest.Case + + test "marks current project to recompile" do + in_fixture("deps_status/deps/ok", fn -> + Mix.Project.in_project(:ok, ".", fn _ -> + refute File.exists?("_build/dev/lib/ok/.mix/compile.lock") + Mix.Task.run("will_recompile") + assert File.exists?("_build/dev/lib/ok/.mix/compile.lock") + end) + end) + end + + test "marks all projects in umbrella to recompile" do + in_fixture("umbrella_dep/deps/umbrella", fn -> + Mix.Project.in_project(:umbrella, ".", fn _ -> + refute File.exists?("_build/dev/lib/foo/.mix/compile.lock") + refute File.exists?("_build/dev/lib/bar/.mix/compile.lock") + Mix.Task.run("will_recompile") + assert File.exists?("_build/dev/lib/foo/.mix/compile.lock") + assert File.exists?("_build/dev/lib/bar/.mix/compile.lock") + end) + end) + end +end |