Skip to content

Commit 1403350

Browse files
author
José Valim
committed
Prune tasks when build per environment is on
1 parent df997f8 commit 1403350

File tree

5 files changed

+53
-11
lines changed

5 files changed

+53
-11
lines changed

lib/mix/lib/mix/project.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ defmodule Mix.Project do
7171
@doc false
7272
def deps_config(config // config()) do
7373
[ build_path: build_path(config),
74-
builds_per_environment: config[:builds_per_environment],
74+
build_per_environment: config[:build_per_environment],
7575
deps_path: deps_path(config) ]
7676
end
7777

@@ -187,7 +187,7 @@ defmodule Mix.Project do
187187
Mix.Project.build_path
188188
#=> "/path/to/project/_build/shared"
189189
190-
If :builds_per_environment is set to true, it
190+
If :build_per_environment is set to true, it
191191
will create a new build per environment:
192192
193193
Mix.env
@@ -197,7 +197,7 @@ defmodule Mix.Project do
197197
198198
"""
199199
def build_path(config // config()) do
200-
config[:build_path] || if config[:builds_per_environment] do
200+
config[:build_path] || if config[:build_per_environment] do
201201
Path.expand("_build/#{Mix.env}")
202202
else
203203
Path.expand("_build/shared")
@@ -322,7 +322,7 @@ defmodule Mix.Project do
322322
end
323323

324324
defp default_config do
325-
[ builds_per_environment: false,
325+
[ build_per_environment: false,
326326
default_task: "run",
327327
deps: [],
328328
deps_path: "deps",

lib/mix/lib/mix/tasks/deps.check.ex

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule Mix.Tasks.Deps.Check do
22
use Mix.Task
33

4-
import Mix.Deps, only: [loaded: 0, format_dep: 1, format_status: 1, check_lock: 2]
4+
import Mix.Deps, only: [loaded: 0, format_dep: 1, format_status: 1, check_lock: 2, ok?: 1]
55

66
@hidden true
77
@shortdoc "Check if all dependencies are valid"
@@ -17,6 +17,8 @@ defmodule Mix.Tasks.Deps.Check do
1717
lock = Mix.Deps.Lock.read
1818
all = Enum.map loaded, &check_lock(&1, lock)
1919

20+
prune_deps(all)
21+
2022
case Enum.partition all, &ok?/1 do
2123
{ _, [] } -> :ok
2224
{ _, not_ok } ->
@@ -32,6 +34,23 @@ defmodule Mix.Tasks.Deps.Check do
3234
end
3335
end
3436

35-
defp ok?(Mix.Dep[status: { :ok, _ }]), do: true
36-
defp ok?(_), do: false
37+
# If the build is per environment, we should be able to look
38+
# at all dependencies and remove the builds that no longer
39+
# has a dependnecy defined for them.
40+
defp prune_deps(all) do
41+
config = Mix.project
42+
if config[:build_per_environment] do
43+
paths = Mix.Project.build_path(config)
44+
|> Path.join("lib/*")
45+
|> Path.wildcard
46+
|> List.delete(Mix.Project.app_path(config))
47+
48+
to_prune = Enum.reduce(all, paths, &(&2 -- Mix.Deps.source_paths(&1)))
49+
50+
Enum.map(to_prune, fn path ->
51+
Code.delete_path(path)
52+
File.rm_rf!(path)
53+
end)
54+
end
55+
end
3756
end

lib/mix/test/fixtures/deps_status/deps/ok/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ defmodule Ok.Mixfile do
33

44
def project do
55
[ app: :ok,
6-
version: "1.0" ]
6+
version: "0.1.0" ]
77
end
88
end

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ defmodule Mix.Tasks.Compile.ElixirTest do
2929

3030
test "compiles a project with per environment build" do
3131
Mix.Project.pop
32-
Mix.ProjectStack.post_config [builds_per_environment: true]
32+
Mix.ProjectStack.post_config [build_per_environment: true]
3333
Mix.Project.push MixTest.Case.Sample
3434

3535
in_fixture "no_mixfile", fn ->

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule Mix.Tasks.DepsTest do
55

66
defmodule DepsApp do
77
def project do
8-
[ app: :deos, version: "0.1.0",
8+
[ app: :deps, version: "0.1.0",
99
deps: [
1010
{ :ok, "0.1.0", github: "elixir-lang/ok" },
1111
{ :invalidvsn, "0.2.0", path: "deps/invalidvsn" },
@@ -19,7 +19,7 @@ defmodule Mix.Tasks.DepsTest do
1919

2020
defmodule SuccessfulDepsApp do
2121
def project do
22-
[ app: :success, version: "0.1.0",
22+
[ app: :sample, version: "0.1.0",
2323
deps: [
2424
{ :ok, "0.1.0", path: "deps/ok" }
2525
]
@@ -154,6 +154,29 @@ defmodule Mix.Tasks.DepsTest do
154154
Mix.Project.pop
155155
end
156156

157+
test "compiles and prunes builds per environment" do
158+
Mix.ProjectStack.post_config [build_per_environment: true]
159+
Mix.Project.push SuccessfulDepsApp
160+
161+
in_fixture "deps_status", fn ->
162+
Mix.Tasks.Deps.Compile.run []
163+
assert File.exists?("_build/dev/lib/ok/ebin/ok.app")
164+
165+
Mix.Tasks.Compile.run []
166+
assert File.exists?("_build/dev/lib/sample/ebin/sample.app")
167+
168+
Mix.ProjectStack.post_config [build_per_environment: true, deps: []]
169+
Mix.Project.pop
170+
Mix.Project.push SuccessfulDepsApp
171+
172+
Mix.Tasks.Deps.Check.run []
173+
refute File.exists?("_build/dev/lib/ok/ebin/ok.app")
174+
assert File.exists?("_build/dev/lib/sample/ebin/sample.app")
175+
end
176+
after
177+
Mix.Project.pop
178+
end
179+
157180
test "unlocks all deps" do
158181
Mix.Project.push DepsApp
159182
in_fixture "no_mixfile", fn ->

0 commit comments

Comments
 (0)