From 4ffb9ec17b451967cea9b7f93c0b8cef68607bf4 Mon Sep 17 00:00:00 2001 From: Water Zheng <1499383852@qq.com> Date: Sat, 16 Dec 2017 17:15:37 +0800 Subject: [PATCH] Require Phoenix to be run as adminstrator only once on Windows (#2679) --- lib/phoenix/code_reloader/server.ex | 43 ++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/lib/phoenix/code_reloader/server.ex b/lib/phoenix/code_reloader/server.ex index f62adc88b1..82290bd20b 100644 --- a/lib/phoenix/code_reloader/server.ex +++ b/lib/phoenix/code_reloader/server.ex @@ -25,17 +25,20 @@ defmodule Phoenix.CodeReloader.Server do def handle_call(:check_symlinks, _from, checked?) do if not checked? and Code.ensure_loaded?(Mix.Project) do - build_path = Mix.Project.build_path() - symlink = Path.join(Path.dirname(build_path), "__phoenix__") + priv_path = "#{Mix.Project.app_path}/priv" + + case :file.read_link(priv_path) do + {:ok, _} -> + :ok - case File.ln_s(build_path, symlink) do - :ok -> - File.rm(symlink) - {:error, :eexist} -> - File.rm(symlink) {:error, _} -> - Logger.warn "Phoenix is unable to create symlinks. Phoenix' code reloader will run " <> - "considerably faster if symlinks are allowed." <> os_symlink(:os.type) + if can_symlink?() do + File.rm_rf(priv_path) + Mix.Project.build_structure + else + Logger.warn "Phoenix is unable to create symlinks. Phoenix' code reloader will run " <> + "considerably faster if symlinks are allowed." <> os_symlink(:os.type) + end end end @@ -78,10 +81,30 @@ defmodule Phoenix.CodeReloader.Server do end defp os_symlink({:win32, _}), - do: " On Windows, such can be done by starting the shell with \"Run as Administrator\"." + do: " On Windows, the lack of symlinks may even cause empty assets to be served. " <> + "Luckily, you can address this issue by starting your Windows terminal at least " <> + "once with \"Run as Administrator\" and then running your Phoenix application." defp os_symlink(_), do: "" + defp can_symlink?() do + build_path = Mix.Project.build_path() + symlink = Path.join(Path.dirname(build_path), "__phoenix__") + + case File.ln_s(build_path, symlink) do + :ok -> + File.rm_rf(symlink) + true + + {:error, :eexist} -> + File.rm_rf(symlink) + true + + {:error, _} -> + false + end + end + defp load_backup(mod) do mod |> :code.which()