Packages

A Useful tool to use inside your Mix projects

Current section

Files

Jump to
baco lib mix tasks escript.new.ex
Raw

lib/mix/tasks/escript.new.ex

defmodule Mix.Tasks.Escript.New do
@moduledoc """
Create a new Mix project that is setup to create an escript
"""
use Mix.Task
alias Mix.Shell.IO
@shortdoc "Create a new escript enabled mix project"
def run([]) do
IO.info("Let's create a new escript.")
app_name = IO.prompt("Please give your project a name (this is used for mix new):")
run([app_name])
end
def run(argv) do
IO.info("Let's create a new escript.")
app_name = appname(argv)
module_name = modulename(argv)
create_escript_project(app_name, module_name)
IO.info("Escript successfully created!")
end
defp appname(argv) do
argv
|> List.first()
|> String.trim()
end
defp modulename(argv) do
argv
|> List.first()
|> String.split("_")
|> Enum.map(&String.capitalize(&1))
|> Enum.join()
end
defp create_escript_project(app_name, module_name) do
System.cmd("mix", ["new", app_name])
File.cd(app_name)
create_main_module(app_name, module_name)
overwrite_mix_exs(app_name, module_name)
end
defp create_main_module(app_name, module_name) do
Mix.Generator.create_file(
"lib/#{app_name}/cli.ex",
"""
defmodule #{module_name}.CLI do
@moduledoc false
def main(_argv) do
IO.puts "This is your new escript!"
end
end
"""
)
end
defp overwrite_mix_exs(app_name, module_name) do
Mix.Generator.create_file(
"mix.exs",
"""
defmodule #{module_name}.MixProject do
use Mix.Project
def project do
[
app: :#{app_name},
version: "0.1.0",
elixir: "~> 1.7",
start_permanent: Mix.env() == :prod,
deps: deps(),
escript: [main_module: #{module_name}.CLI]
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
]
end
end
""",
[force: true]
)
end
end