Создание консольных приложений на Elixir
Разработчики ПО, как правило, не представляют себе жизни без командной строки, а консольные приложения используются везде, где только можно. Python, Ruby, Erlang и Elixir дают разработчикам замечательные инструменты командной строки, называемые как раз консольными приложениями.
В этой статье рассказывается, как создавать свои консольные приложения, для чего Elixir подходит как нельзя лучше.
Создание приложения
Создадим новый проект с помощью mix.
$> mix new awesome_cli
$> cd awesome_cliОткройте файл lib/awesome_cli.ex, где вы увидите нечто подобное:
defmodule AwesomeCli do
use Application.Behaviour
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
AwesomeCli.Supervisor.start_link
end
endПокажите, кто тут крутой программист: добавьте в проект вывод сообщения «Hello World».
defmodule AwesomeCli do
use Application.Behaviour
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
AwesomeCli.Supervisor.start_link
end
def main(args) do
IO.puts "Hello, world!"
end
endПосле этого запустите mix escript.build для сборки проекта.
$> mix escript.buildВозможно, возникнет такая ошибка:
** (Mix) Could not generate escript, please set :escript in your project configuration
to a function that returns the escript configuration for our application.
So let's do that by openingmix.exs` file.Попробуем пойти другим путём — откроем файл mix.exs.
defmodule AwesomeCli.Mixfile do
use Mix.Project
def project do
[app: :awesome_cli,
version: "0.0.1",
elixir: "~> 1.0.4",
escript: escript,
deps: deps]
end
def escript do
[main_module: AwesomeCli]
end
def application do
[ applications: [],
mod: { AwesomeCli, [] } ]
end
defp deps do
[]
end
endПерезапустим mix escript.build, после чего mix выполнит компиляцию файла awesome_cli.ex и создаст файл Elixir.AwesomeCli.beam и исполняемый файл awesome_cli в директории _build/dev/lib/awesome_cli/ebin. Откроем исполняемый файл.
$> ./awesome_cli
Hello, world!Вот вы и создали своё первое работающее приложение на Elixir!
Парсинг аргументов
Нам повезло, что для парсинга аргументов интерфейса командной строки в Elixir имеется . Воспользуемся им, чтобы создать хитроумный инструмент командной строки, который бы получал один или два аргумента от пользователя.
Первым делом научим инструмент приветствовать пользователя с заданным именем. Вот что мы сделаем:
./awesome_cli --name ElixirFriendОткройте файл lib/awesome_cli.ex и добавьте в него следующий код:
def main(args) do
args |> parse_args
end
def parse_args(args) do
{[name: name], _, _} = OptionParser.parse(args)
IO.puts "Hello, #{name}! You're awesome!!"
endОператор |> используется для передачи аргумента в функцию parse_args, а парсинг аргументов проводится с помощью OptionParser.parse. Вывод осуществлён для одного из аргументов. Если сейчас снова запустить mix escript.build, то получится следующее:
$> mix escript.build
$> ./awesome_cli --name ElixirFriend
Hello, ElixirFriend! You're awesome!!Здорово, правда? Теперь, чтобы сделать CLI ещё круче, добавим в него справочное сообщение. Так пользователь поймёт, как с ним обращаться. Для этого воспользуемся конструкцией case и проведём сопоставление с образцом.
def parse_args(args) do
options = OptionParser.parse(args)
case options do
{[name: name], _, _} -> IO.puts "Hello, #{name}! You're awesome!!"
{[help: true], _, _} -> IO.puts "This is help message"
end
endПерезапустим mix escript.build ещё раз и выполним файл с помощью --help.
$> ./awesome_cli --name ElixirFriend
Hello, ElixirFriend! You're awesome!!
$> ./awesome_cli --help
This is help messageПоследний штрих
Давайте немного перестроим код. Сначала, сделаем так, чтобы функция parse_args выполняла только парсинг аргументов и возвращаемый ею результат можно было бы использовать в другой функции.
def main(args) do
args |> parse_args |> do_process
end
def parse_args(args) do
options = OptionParser.parse(args)
case options do
{[name: name], _, _} -> [name]
{[help: true], _, _} -> :help
_ -> :help
end
end
def do_process([name]) do
IO.puts "Hello, #{name}! You're awesome!!"
end
def do_process(:help) do
IO.puts """
Usage:
./awesome_cli --name [your name]
Options:
--help Show this help message.
Description:
Prints out an awesome message.
"""
System.halt(0)
endПерезапустите mix escript.build и попробуйте его выполнить.
$> mix escript.build
$> ./awesome_cli --name ElixirFriend
Hello, ElixirFriend! You're awesome!!
$> ./awesome_cli --help
Usage:
./awesome_cli --name [your name]
Options:
--help Show this help message.
Description:
Prints out an awesome message.
$> ./awesome_cli
Usage:
./awesome_cli --name [your name]
Options:
--help Show this help message.
Description:
Prints out an awesome message.Заключение
Мы рассмотрели, как создавать простые консольные приложения посредством OptionParser и как заставить код работать с помощью mix escript.build. И пусть приведённый пример не изобилует сложными конструкциями, но даже на нём видно, что создавать консольные приложения в Elixir — просто и очень удобно.