Skip to content

Commit 88b3e86

Browse files
felipesereJosé Valim
authored andcommitted
Clean deps when deps.compile is run with --force (#4780)
Signed-off-by: José Valim <[email protected]>
1 parent efaca6c commit 88b3e86

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

lib/mix/lib/mix/tasks/deps.compile.ex

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule Mix.Tasks.Deps.Compile do
3333
import Mix.Dep, only: [loaded: 1, available?: 1, loaded_by_name: 2,
3434
make?: 1, mix?: 1]
3535

36-
@switches [include_children: :boolean]
36+
@switches [include_children: :boolean, force: :boolean]
3737

3838
@spec run(OptionParser.argv) :: :ok
3939
def run(args) do
@@ -44,18 +44,18 @@ defmodule Mix.Tasks.Deps.Compile do
4444
Mix.Project.get!
4545

4646
case OptionParser.parse(args, switches: @switches) do
47-
{_, [], _} ->
47+
{opts, [], _} ->
4848
# Because this command may be invoked explicitly with
4949
# deps.compile, we simply try to compile any available
5050
# dependency.
51-
compile(Enum.filter(loaded(env: Mix.env), &available?/1))
51+
compile(Enum.filter(loaded(env: Mix.env), &available?/1), opts)
5252
{opts, tail, _} ->
53-
compile(loaded_by_name(tail, [env: Mix.env] ++ opts))
53+
compile(loaded_by_name(tail, [env: Mix.env] ++ opts), opts)
5454
end
5555
end
5656

5757
@doc false
58-
def compile(deps) do
58+
def compile(deps, options \\ []) do
5959
shell = Mix.shell
6060
config = Mix.Project.deps_config
6161

@@ -65,6 +65,8 @@ defmodule Mix.Tasks.Deps.Compile do
6565
Enum.map(deps, fn %Mix.Dep{app: app, status: status, opts: opts, scm: scm} = dep ->
6666
check_unavailable!(app, status)
6767

68+
clean(app, options)
69+
6870
compiled? = cond do
6971
not is_nil(opts[:compile]) ->
7072
do_compile dep, config
@@ -93,6 +95,12 @@ defmodule Mix.Tasks.Deps.Compile do
9395
if true in compiled, do: Mix.Dep.Lock.touch_manifest, else: :ok
9496
end
9597

98+
defp clean(app, opts) do
99+
if Keyword.get(opts, :force, false) do
100+
File.rm_rf! Path.join [Mix.Project.build_path, "lib", Atom.to_string(app)]
101+
end
102+
end
103+
96104
defp touch_fetchable(scm, path) do
97105
if scm.fetchable? do
98106
File.mkdir_p!(path)

lib/mix/test/mix/tasks/deps_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,20 @@ defmodule Mix.Tasks.DepsTest do
193193

194194
## deps.unlock
195195

196+
test "cleans and recompiles artifacts if --force given" do
197+
Mix.Project.push SuccessfulDepsApp
198+
199+
in_fixture "deps_status", fn ->
200+
Mix.Tasks.Deps.Compile.run []
201+
File.touch! "_build/dev/lib/ok/clean-me"
202+
203+
Mix.Tasks.Deps.Compile.run ["--force"]
204+
refute File.exists? "_build/dev/lib/ok/clean-me"
205+
end
206+
end
207+
208+
## deps.unlock
209+
196210
test "unlocks all deps", context do
197211
Mix.Project.push DepsApp
198212
in_tmp context.test, fn ->

0 commit comments

Comments
 (0)