     all   = opts[:force] || Mix.Utils.stale?(check_files, [manifest]) || path_deps_changed?(manifest)
     stale = if all, do: to_watch, else: Mix.Utils.extract_stale(to_watch, [manifest])
 
-    if stale != [] do
+    files_to_path(manifest, stale, to_compile, compile_path, fn ->
       File.mkdir_p!(compile_path)
       Code.prepend_path(compile_path)
-
       set_compiler_opts(project, opts, [])
-      files_to_path(manifest, stale, to_compile, compile_path)
-      :ok
-    else
-      :noop
-    end
+    end)
   end
 
   @doc """

    use GenServer.Behaviour
    @moduledoc false

    def files_to_path(manifest, stale, all, compile_path) do
      entries = read_manifest(manifest)

      # Each entry that is not in all must be removed
      entries = lc { beam, _m, source, _d } = entry inlist entries,
                   is_in_list_or_remove(source, all, beam),
                   do: entry


  in between modules, which helps it recompile only the modules that
  have changed at runtime.
  """
  defdelegate files_to_path(manifest, stale, all, path, on_start), to: ManifestCompiler

  defp set_compiler_opts(project, opts, extra) do
    opts = Dict.take(opts, [:docs, :debug_info, :ignore_module_conflict, :warnings_as_errors])
