refactor: reuse overlay dsl in application

This commit is contained in:
x1001100011 2021-10-19 23:52:25 -07:00
parent 6a4b437446
commit 783a10c5a1
4 changed files with 44 additions and 106 deletions

View File

@ -92,6 +92,10 @@ defmodule EmqxReleaseHelper.Applications do
start_type :load start_type :load
end end
application :emqx_limiter do
start_type :permanent
end
application :emqx_prometheus, %{release_type: :cloud} do application :emqx_prometheus, %{release_type: :cloud} do
start_type :load start_type :load
end end
@ -120,25 +124,11 @@ defmodule EmqxReleaseHelper.Applications do
start_type :load start_type :load
end end
application :lc do
start_type :load
end
application :xmerl, %{release_type: :cloud} do application :xmerl, %{release_type: :cloud} do
start_type :permanent start_type :permanent
end end
def run(release, config) do
%{project_path: project_path, apps_paths: apps_paths} = config
__all__()
|> Enum.filter(fn %{name: name} -> Map.has_key?(apps_paths, name) end)
|> Enum.filter(fn
%{enable?: fun} -> fun.(config)
_ -> true
end)
|> Enum.each(fn %{name: name, overlays: overlays} ->
app_path = Map.get(apps_paths, name)
config = Map.put(config, :app_source_path, Path.join(project_path, app_path))
Enum.each(overlays, fn overlay -> overlay.(config) end)
end)
release
end
end end

View File

@ -2,8 +2,15 @@ defmodule EmqxReleaseHelper.DSL.Application do
defmacro __using__(_) do defmacro __using__(_) do
quote do quote do
import unquote(__MODULE__) import unquote(__MODULE__)
import EmqxReleaseHelper.DSL.Overlay, only: [
overlay: 1,
overlay: 2,
copy: 2,
template: 2
]
Module.register_attribute(__MODULE__, :applications, accumulate: true) Module.register_attribute(__MODULE__, :applications, accumulate: true)
@before_compile unquote(__MODULE__) @before_compile unquote(__MODULE__)
@overlay_source_path :app_source_path
end end
end end
@ -44,80 +51,6 @@ defmodule EmqxReleaseHelper.DSL.Application do
end end
end end
defmacro overlay(do: block) do
block =
Macro.escape(
quote do
fn unquote(Macro.var(:config, nil)) ->
unquote(block)
end
end
)
quote do
@overlays [unquote(block) | @overlays]
end
end
defmacro overlay(literal_config, do: block) do
block =
Macro.escape(
quote do
fn unquote(literal_config) = unquote(Macro.var(:config, nil)) ->
unquote(block)
end
end
)
quote do
@overlays [unquote(block) | @overlays]
end
end
defmacro copy(from_path, to_path) do
from_path =
quote do
unquote(Macro.var(:config, nil))
|> Map.get(:app_source_path)
|> Path.join(unquote(from_path))
end
to_path =
quote do
unquote(Macro.var(:config, nil))
|> Map.get(:release_path)
|> Path.join(unquote(to_path))
end
quote do
EmqxReleaseHelper.DSL.Overlay.run_copy(unquote(from_path), unquote(to_path))
end
end
defmacro template(from_path, to_path) do
from_path =
quote do
unquote(Macro.var(:config, nil))
|> Map.get(:app_source_path)
|> Path.join(unquote(from_path))
end
to_path =
quote do
unquote(Macro.var(:config, nil))
|> Map.get(:release_path)
|> Path.join(unquote(to_path))
end
quote do
EmqxReleaseHelper.DSL.Overlay.run_template(
unquote(from_path),
unquote(to_path),
unquote(Macro.var(:config, nil))
)
end
end
defmacro __before_compile__(%Macro.Env{module: module}) do defmacro __before_compile__(%Macro.Env{module: module}) do
block = block =
module module
@ -127,6 +60,24 @@ defmodule EmqxReleaseHelper.DSL.Application do
quote do quote do
def __all__, do: unquote(block) def __all__, do: unquote(block)
def run(release, config) do
%{project_path: project_path, apps_paths: apps_paths} = config
__all__()
|> Enum.filter(fn %{name: name} -> Map.has_key?(apps_paths, name) end)
|> Enum.filter(fn
%{enable?: fun} -> fun.(config)
_ -> true
end)
|> Enum.each(fn %{name: name, overlays: overlays} ->
app_path = Map.get(apps_paths, name)
config = Map.put(config, :app_source_path, Path.join(project_path, app_path))
Enum.each(overlays, fn overlay -> overlay.(config) end)
end)
release
end
end end
end end
end end

View File

@ -2,8 +2,9 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
defmacro __using__(_) do defmacro __using__(_) do
quote do quote do
import unquote(__MODULE__) import unquote(__MODULE__)
Module.register_attribute(__MODULE__, :overlays, accumulate: true)
@before_compile unquote(__MODULE__) @before_compile unquote(__MODULE__)
@overlays []
@overlay_source_path :project_path
end end
end end
@ -18,7 +19,7 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
) )
quote do quote do
@overlays unquote(block) @overlays [unquote(block) | @overlays]
end end
end end
@ -33,7 +34,7 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
) )
quote do quote do
@overlays unquote(block) @overlays [unquote(block) | @overlays]
end end
end end
@ -54,7 +55,7 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
from_path = from_path =
quote do quote do
unquote(Macro.var(:config, nil)) unquote(Macro.var(:config, nil))
|> Map.get(:project_path) |> Map.get(@overlay_source_path)
|> Path.join(unquote(from_path)) |> Path.join(unquote(from_path))
end end
@ -66,7 +67,7 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
end end
quote do quote do
run_copy(unquote(from_path), unquote(to_path)) unquote(__MODULE__).run_copy(unquote(from_path), unquote(to_path))
end end
end end
@ -74,7 +75,7 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
from_path = from_path =
quote do quote do
unquote(Macro.var(:config, nil)) unquote(Macro.var(:config, nil))
|> Map.get(:project_path) |> Map.get(@overlay_source_path)
|> Path.join(unquote(from_path)) |> Path.join(unquote(from_path))
end end
@ -86,7 +87,7 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
end end
quote do quote do
run_template( unquote(__MODULE__).run_template(
unquote(from_path), unquote(from_path),
unquote(to_path), unquote(to_path),
unquote(Macro.var(:config, nil)) unquote(Macro.var(:config, nil))
@ -122,8 +123,9 @@ defmodule EmqxReleaseHelper.DSL.Overlay do
|> Enum.reverse() |> Enum.reverse()
quote do quote do
def __overlays__ do def run(release, config) do
unquote(block) Enum.each(unquote(block), fn overlay -> overlay.(config) end)
release
end end
end end
end end

View File

@ -18,9 +18,4 @@ defmodule EmqxReleaseHelper.Overlay do
template "data/emqx_vars", "releases/emqx_vars" template "data/emqx_vars", "releases/emqx_vars"
template "data/BUILT_ON", "releases/#{release_version}/BUILT_ON" template "data/BUILT_ON", "releases/#{release_version}/BUILT_ON"
end end
def run(release, config) do
Enum.each(__overlays__(), fn overlay -> overlay.(config) end)
release
end
end end