@@ -715,6 +715,7 @@ defmodule Mix do
715
715
consolidate_protocols: Keyword . get ( opts , :consolidate_protocols , true )
716
716
]
717
717
718
+ started_apps = Application . started_applications ( )
718
719
:ok = Mix.Local . append_archives ( )
719
720
:ok = Mix.ProjectStack . push ( @ mix_install_project , config , "nofile" )
720
721
build_dir = Path . join ( dir , "_build" )
@@ -729,6 +730,11 @@ defmodule Mix do
729
730
end
730
731
731
732
Mix.Task . rerun ( "deps.loadpaths" )
733
+
734
+ # Hex and SSL can use a good amount of memory after the registry fetching,
735
+ # so we stop any app started during deps resolution.
736
+ stop_apps ( Application . started_applications ( ) -- started_apps )
737
+
732
738
Mix.Task . rerun ( "compile" )
733
739
end )
734
740
@@ -743,6 +749,33 @@ defmodule Mix do
743
749
end
744
750
end
745
751
752
+ defp stop_apps ( [ ] ) , do: :ok
753
+
754
+ defp stop_apps ( apps ) do
755
+ :logger . add_primary_filter ( :silence_app_exit , { & silence_app_exit / 2 , [ ] } )
756
+ Enum . each ( apps , fn { app , _ , _ } -> Application . stop ( app ) end )
757
+ :logger . remove_primary_filter ( :silence_app_exit )
758
+ :ok
759
+ end
760
+
761
+ defp silence_app_exit (
762
+ % {
763
+ msg:
764
+ { :report ,
765
+ % {
766
+ label: { :application_controller , :exit } ,
767
+ report: [ application: _ , exited: :stopped ] ++ _
768
+ } }
769
+ } ,
770
+ _extra
771
+ ) do
772
+ :stop
773
+ end
774
+
775
+ defp silence_app_exit ( _message , _extra ) do
776
+ :ignore
777
+ end
778
+
746
779
defp maybe_expand_path_dep ( opts ) do
747
780
if Keyword . has_key? ( opts , :path ) do
748
781
Keyword . update! ( opts , :path , & Path . expand / 1 )
0 commit comments