Rebar3 (I): Primeros Pasos

La versión de Erlang OTP 19 ya está cada vez más cerca y una de las principales características es la inclusión de rebar3. Esta herramienta ha cambiado mucho desde su versión 2 influenciada por mix. Sus creadores dicen que se trata de una herramienta completamente diferente. ¿Le echamos un vistazo?

rebar es una herramienta desarrollada por Basho. Esta herramienta ha tenido cambios muy drásticos a la hora de cambiar su versión raíz. En esta tercera versión rebar3 vemos muchos cambios con respecto a la versión 2 pero con mucha lógica y agregando un aspecto visual mejorado.

En lugar de comentar los cambios voy a dar un repaso a las acciones más comunes para ver cómo se realizan en esta nueva versión. Desde la creación de un proyecto hasta su liberación. No obstante, como este no quiero alargarme en un solo artículo, lo voy a separar en unos dos o tres y según comentarios iré expandiendo.

NOTA: en el libro Erlang/OTP Volumen I: Un Mundo Concurrente hay un capítulo específico para la creación de un proyecto utilizando rebar en su versión 2.

Creando un Proyecto

Esta herramienta nos permite crear una estructura de proyecto desde cero. Tiene distintas plantillas por defecto: app, cmake, escript, lib, plugin y release.

Los más usados son app para crear aplicaciones para ser incluídas en otros proyectos como dependencias y release para crear aplicaciones que se puedan empaquetar para su liberación. Vamos a emplear release:

$ rebar3 new release myserver
===> Writing myserver/apps/myserver/src/myserver_app.erl
===> Writing myserver/apps/myserver/src/myserver_sup.erl
===> Writing myserver/apps/myserver/src/myserver.app.src
===> Writing myserver/rebar.config
===> Writing myserver/config/sys.config
===> Writing myserver/config/vm.args
===> Writing myserver/.gitignore
===> Writing myserver/LICENSE
===> Writing myserver/README.md

Con esta estructura solo nos faltaría agregar nuestro código en el directorio src creado dentro de myserver/apps/myserver, compilar y liberar.

Construir y Probar el Proyecto

La acción de compilar simple:

$ cd myserver
$ rebar3 compile
===> Verifying dependencies...
===> Compiling myserver

Como se puede apreciar, esto no solo compila sino que también comprueba y baja las dependencias en caso de ser necesarias. Podemos ver que tras este paso se han creado nuevos directorios y ficheros:

$ ls
LICENSE      _build       config       rebar.lock
README.md    apps         rebar.config rebar3
$ tree _build
_build/
+-- default
    +-- lib
        +-- myserver
            +-- ebin
            |   +-- myserver.app
            |   +-- myserver_app.beam
            |   +-- myserver_sup.beam
            +-- include -> ../../../../apps/myserver/include
            +-- priv -> ../../../../apps/myserver/priv
            +-- src -> ../../../../apps/myserver/src

5 directories, 5 files

Aparece un fichero rebar.lock donde se apuntará la información específica de las dependencias instaladas (en caso de que haya alguna) y el directorio _build en el que se incluye todo el código compilado.

rebar3 viene con profiles (perfiles). Los perfiles permiten especificar opciones para cada tipo de construcción dentro de rebar.config. Por defecto, se crea el perfil default y el perfile prod. En el perfil por defecto (default) está activo por configuración el modo desarrollo (dev_mode) y deshabilitada la copia de erts (la ErlangVM) para la creación del proyecto. Como se ve en el listado de ficheros, esto implica que no se copie nada, solo se crean enlaces simbólicos a donde está todo compilado.

Para ejecutarlo tenemos varias opciones, yo prefiero emplear la ejecución en primer plano a través de la consola, por lo que siempre ejecuto:

$ ./rebar3 shell
===> Verifying dependencies...
===> Compiling myserver
Erlang/OTP 18 [erts-7.3] [source-d2a6d81] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V7.3  (abort with ^G)
1> ===> The rebar3 shell is a development tool; to deploy applications in production, consider using releases (http://www.rebar3.org/v3.0/docs/releases)
===> Booted myserver
===> Booted sasl

=PROGRESS REPORT==== 28-May-2016::19:20:00 ===
          supervisor: {local,sasl_safe_sup}
             started: [{pid,<0.77.0>},
                       {id,alarm_handler},
                       {mfargs,{alarm_handler,start_link,[]}},
                       {restart_type,permanent},
                       {shutdown,2000},
                       {child_type,worker}]

...

Al no haber instalado y configurado lager todos los logs son bastante extensos así que he puesto la salida inicial solo.

Todo se arranca siguiendo la especificación de rebar.config y tenemos a nuestra disposición una shell.

Conclusiones

Ha sido un acercamiento muy breve a rebar3 y como he mencionado antes haré más de diferentes partes. De momento, dejo un proyecto que he estado desarrollando aquí en el que no solo he creado el proyecto con rebar, sino también tests.

El uso de rebar3 me ha dejado un buen sabor de boca y en comparación con la versión anterior lo veo mucho más robusto y estético. Todo se hace de forma más simple y los ficheros de configuración se han simplificado enormemente.

¿Has probado ya OTP 19?, ¿Y rebar3?, ¿Te animas a comenzar un proyecto? ¡Danos tu opinión!