@@ -17,26 +17,14 @@ defmodule Mix.Dep.Loader do
17
17
* `:env` - filter dependencies on given environments
18
18
"""
19
19
def children ( opts ) do
20
- from = Path . absname ( "mix.exs" )
21
- deps = Enum . map ( Mix.Project . config [ :deps ] || [ ] , & to_dep ( & 1 , from ) )
22
-
23
- # Filter deps not matching mix environment
24
- if env = opts [ :env ] do
25
- deps =
26
- Enum . filter ( deps , fn % Mix.Dep { opts: opts } ->
27
- only = opts [ :only ]
28
- if only , do: env in List . wrap ( only ) , else: true
29
- end )
30
- end
31
-
32
- deps ++ Mix.Dep.Umbrella . unloaded
20
+ mix_children ( opts ) ++ Mix.Dep.Umbrella . unloaded
33
21
end
34
22
35
23
@ doc """
36
24
Loads the given dependency information, including its
37
25
latest status and children.
38
26
"""
39
- def load ( dep ) do
27
+ def load ( dep , children ) do
40
28
% Mix.Dep { manager: manager , scm: scm , opts: opts } = dep
41
29
dep = % { dep | status: scm_status ( scm , opts ) }
42
30
dest = opts [ :dest ]
@@ -47,16 +35,16 @@ defmodule Mix.Dep.Loader do
47
35
{ dep , [ ] }
48
36
49
37
manager == :rebar ->
50
- rebar_dep ( dep )
38
+ rebar_dep ( dep , children )
51
39
52
40
mix? ( dest ) ->
53
- mix_dep ( % { dep | manager: :mix } )
41
+ mix_dep ( dep , children )
54
42
55
43
rebar? ( dest ) ->
56
- rebar_dep ( % { dep | manager: :rebar } )
44
+ rebar_dep ( dep , children )
57
45
58
46
make? ( dest ) ->
59
- { % { dep | manager: :make } , [ ] }
47
+ make_dep ( dep )
60
48
61
49
true ->
62
50
{ dep , [ ] }
@@ -200,35 +188,60 @@ defmodule Mix.Dep.Loader do
200
188
201
189
## Fetching
202
190
203
- defp mix_dep ( % Mix.Dep { opts: opts } = dep ) do
191
+ defp mix_dep ( % Mix.Dep { opts: opts } = dep , children ) do
204
192
Mix.Dep . in_dependency ( dep , fn _ ->
205
193
umbrella? = Mix.Project . umbrella?
206
194
207
195
if umbrella? do
208
196
opts = Keyword . put_new ( opts , :app , false )
209
197
end
210
198
199
+ children = ( mix_children ( env: opts [ :env ] || :prod ) |> filter_children ( children ) )
200
+ ++ Mix.Dep.Umbrella . unloaded
201
+
211
202
dep = % { dep | manager: :mix , opts: opts , extra: [ umbrella: umbrella? ] }
212
- { dep , children ( env: opts [ :env ] || :prod ) }
203
+ { dep , children }
213
204
end )
214
205
end
215
206
216
- defp rebar_dep ( % Mix.Dep { } = dep ) do
207
+ defp rebar_dep ( % Mix.Dep { } = dep , children ) do
217
208
Mix.Dep . in_dependency ( dep , fn _ ->
218
209
rebar = Mix.Rebar . load_config ( "." )
219
210
extra = Dict . take ( rebar , [ :sub_dirs ] )
220
211
dep = % { dep | manager: :rebar , extra: extra }
221
- { dep , rebar_children ( rebar ) }
212
+ { dep , rebar |> rebar_children |> filter_children ( children ) }
222
213
end )
223
214
end
224
215
216
+ defp make_dep ( dep ) do
217
+ { % { dep | manager: :make } , [ ] }
218
+ end
219
+
220
+ defp mix_children ( opts ) do
221
+ from = Path . absname ( "mix.exs" )
222
+ deps = Enum . map ( Mix.Project . config [ :deps ] || [ ] , & to_dep ( & 1 , from ) )
223
+
224
+ # Filter deps not matching mix environment
225
+ if env = opts [ :env ] do
226
+ Enum . filter ( deps , fn % Mix.Dep { opts: opts } ->
227
+ only = opts [ :only ]
228
+ if only , do: env in List . wrap ( only ) , else: true
229
+ end )
230
+ else
231
+ deps
232
+ end
233
+ end
234
+
225
235
defp rebar_children ( root_config ) do
226
236
from = Path . absname ( "rebar.config" )
227
237
Mix.Rebar . recur ( root_config , fn config ->
228
238
Mix.Rebar . deps ( config ) |> Enum . map ( & to_dep ( & 1 , from , :rebar ) )
229
239
end ) |> Enum . concat
230
240
end
231
241
242
+ defp filter_children ( deps , nil ) , do: deps
243
+ defp filter_children ( deps , children ) , do: Enum . filter ( deps , & ( & 1 . app in children ) )
244
+
232
245
defp validate_path ( % Mix.Dep { scm: scm , manager: manager } = dep ) do
233
246
if scm == Mix.SCM.Path and not manager in [ :mix , nil ] do
234
247
Mix . raise ":path option can only be used with mix projects, " <>
0 commit comments