chore: helper script to bootstrap umbrella `mix.exs` files
This commit is contained in:
parent
dea2bf19b1
commit
0ece860383
|
@ -0,0 +1,136 @@
|
|||
#!/usr/bin/env elixir
|
||||
|
||||
defmodule FiatLux do
|
||||
def main(argv) do
|
||||
{flags, [app_path]} = OptionParser.parse!(argv, strict: [force: :boolean])
|
||||
force = Keyword.get(flags, :force, false)
|
||||
["apps", app_name] = Path.split(app_path)
|
||||
|
||||
{:ok, rebar_props} =
|
||||
app_path
|
||||
|> Path.join("rebar.config")
|
||||
|> :file.consult()
|
||||
|
||||
{:ok, [{:application, app_name, app_props}]} =
|
||||
[app_path, "src", app_name <> ".app.src"]
|
||||
|> Path.join()
|
||||
|> :file.consult()
|
||||
|
||||
app_deps =
|
||||
app_props
|
||||
|> Keyword.get(:applications, [])
|
||||
|> Kernel.--([:kernel, :stdlib])
|
||||
|
||||
umbrella_deps =
|
||||
rebar_props
|
||||
|> Keyword.get(:deps, [])
|
||||
# |> Enum.filter(fn x ->
|
||||
# match?({_, {:path, _}}, x)
|
||||
# end)
|
||||
|> Enum.map(fn
|
||||
{app, {:path, _}} ->
|
||||
# hack to format 2-tuple
|
||||
{:__block__, [], [{app, in_umbrella: true}]}
|
||||
|
||||
{app, {:git, url, {:tag, tag}}} ->
|
||||
slug =
|
||||
url
|
||||
|> to_string()
|
||||
|> String.replace_prefix("https://github.com/", "")
|
||||
|> String.replace_suffix(".git", "")
|
||||
# hack to format 2-tuple
|
||||
{:__block__, [], [{app, github: slug, tag: to_string(tag)}]}
|
||||
|
||||
{app, {:git_subdir, url, {:tag, tag}, subdir}} ->
|
||||
slug =
|
||||
url
|
||||
|> to_string()
|
||||
|> String.replace_prefix("https://github.com/", "")
|
||||
|> String.replace_suffix(".git", "")
|
||||
# hack to format 2-tuple
|
||||
{:__block__, [], [{app, github: slug, tag: to_string(tag), sparse: to_string(subdir)}]}
|
||||
|
||||
{app, vsn} when is_list(vsn) ->
|
||||
# hack to format 2-tuple
|
||||
{:__block__, [], [{app, to_string(vsn)}]}
|
||||
end)
|
||||
|
||||
app_mod = Keyword.get(app_props, :mod)
|
||||
|
||||
code_str =
|
||||
mix_project(app_name, app_mod, umbrella_deps)
|
||||
|> Code.quoted_to_algebra()
|
||||
|> Inspect.Algebra.format(95)
|
||||
|
||||
IO.puts(code_str)
|
||||
|
||||
dest = Path.join([app_path, "mix.exs"])
|
||||
if File.exists?(dest) && not force do
|
||||
IO.puts("#{dest} already exists!")
|
||||
exit(1)
|
||||
else
|
||||
File.write!(dest, [code_str, "\n"])
|
||||
IO.puts("written #{dest}")
|
||||
end
|
||||
end
|
||||
|
||||
def mix_project(app_name, app_mod, umbrella_deps) do
|
||||
application = if app_mod do
|
||||
quote do
|
||||
[
|
||||
extra_applications: UMP.extra_applications(),
|
||||
mod: unquote(app_mod)
|
||||
]
|
||||
end
|
||||
else
|
||||
quote do
|
||||
[
|
||||
extra_applications: UMP.extra_applications()
|
||||
]
|
||||
end
|
||||
end
|
||||
mod_name =
|
||||
app_name
|
||||
|> to_string()
|
||||
|> String.replace_prefix("emqx_", "")
|
||||
|> Macro.camelize()
|
||||
|> then(& "Elixir.EMQX" <> &1 <> ".MixProject")
|
||||
|> String.to_atom()
|
||||
quote do
|
||||
defmodule unquote(mod_name) do
|
||||
use Mix.Project
|
||||
alias EMQXUmbrella.MixProject, as: UMP
|
||||
|
||||
def project do
|
||||
[
|
||||
app: unquote(app_name),
|
||||
version: "0.1.0",
|
||||
build_path: "../../_build",
|
||||
# config_path: "../../config/config.exs",
|
||||
erlc_options: UMP.erlc_options(),
|
||||
erlc_paths: UMP.erlc_paths(),
|
||||
deps_path: "../../deps",
|
||||
lockfile: "../../mix.lock",
|
||||
elixir: "~> 1.14",
|
||||
start_permanent: Mix.env() == :prod,
|
||||
deps: deps()
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help compile.app" to learn about applications
|
||||
def application do
|
||||
unquote(application)
|
||||
end
|
||||
|
||||
def deps() do
|
||||
[
|
||||
unquote_splicing(umbrella_deps)
|
||||
]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
System.argv()
|
||||
|> FiatLux.main()
|
Loading…
Reference in New Issue