Criando binários de aplicações Elixir utilizando bakeware
Já dizia o rei:
Bakeware extends Mix releases with the ability to turn Elixir projects into single binaries that can be copied and directly run. No need to install Erlang or untar files. The binaries look and feel like the build-products from other languages.
Similar ao que temos em outras linguagens como GOlang, com o bakeware conseguimos compilar uma aplicação elixir em um único binário. Criado nos ombros da feature excelente de releases do elixir nas últimas versoes, o bakeware oferece até estratégias de compressão utilizando Zstandard.
Dentro do repo do bakeware, existem alguns exemplos de como criar binários considerando alguns cenários (Cli apps, phoenix, etc)
Para demonstrar a ferramenta irei criar o binário de uma aplicação que desenvolvi para bannergrab chamada binoculo. Utilizamos a ferramenta via cli então a distribuição/releases de um binário para esse tipo de aplicação se torna muito interessante.
Preparando o terreno
- É necessáro clonar o bakeware fora do diretório que queremos compilar
- Em seguida é necessário algumas modificações no arquivo
mix.exs
da aplicação:
1 | def application do |
dentro da função
application
nós adicionamos a chave mod para passar argumentos do usuário para a funçãomain
do móduloBinoculo.CLI
dentro da função
release
definimos o nome da aplicação via a primeira chave da keywordlist- overwrite: para substituir um binário pré-existente
- steps: Steps de compilação utilizando a função
assemble/1
do módulo Bakeware - strip_beams: remove info de debug relacionado à beam
e em deps basicamente incluímos a biblioteca especificando o diretório. A opção
runtime: false
remove depedências de compilação então é importante ser false conforme recomenda a documentação
E por último dentro do módulo de fato que no caso é Binoculo.CLI
devemos alterar a funçaõ main
para receber os argumentos da linha de comando:
1 | defmodule Binoculo.CLI do |
dessa forma os argumentos podem continuar sendo parseados como era feito utilizando o escript.
após isso com o comando mix release
é possível gerar o binário:
1 | girorme@DESKTOP-MN7HFPO ~/repositorios/binoculo (binary-release) $ mix release |
Ao término basta executar o binário dentro da pasta _build/prod/rel/bakeware
:
1 | girorme@DESKTOP-MN7HFPO ~/repositorios/binoculo/_build/prod/rel/bakeware (binary-release) $ ./binoculo -h |
Para mais informações e casos de uso: Bakeware-repo
[]’s