2009-12-08 16 views
9

Para iniciar mi programa que hago la siguiente secuencia:Erlang - script de inicio

$ erl 
> c(module1). 
> c(module2). 
> c(modulen). 
modulen:start(). 

¿Hay alguna posibilidad de crear un script que me permiten lanzar mi programa?

Respuesta

12

Usted podría utilizar un script de cargador que se encarga de iniciar su aplicación de manera OTP:

-module(XYZ_app). 

-export([start/0]). 

start() -> 
    application:start(inets), 
    application:start(XYZ). 

Ejecuta ese script a través de un script de shell. Tenga cuidado con el uso de escript si planea construir demonios que se ejecuten en el momento del arranque del sistema operativo ya que son complicados.

#!/bin/bash 
erl -boot start_sasl -s XYZ_app start 

Por supuesto que necesita su archivo XYZ.app (es un ejemplo):

{application, tinycouch, 
[{description, "tinycouch"}, 
    {vsn, "0.1"}, 
    {modules, [ 
     tinycouch, tinycouch_app, tinycouch_sup, 
     tinycouch_server, tinycouch_logger_h, tinycouch_utils, 
     tinycouch_db, mod_tinycouch 
     ]}, 
    {registered, [tinycouch 
      ,tinycouch_server 
      ,tinycouch_sup 
      ]}, 
    {applications, [kernel, stdlib, sasl, inets]}, 
    {env, []}, 

    %% Application Start point 
    {mod, {tinycouch_sup, []}}]}. 

... y todos sus archivos .erl debe haber sido compilado.

Nota que si se va a distribuir su aplicación (por ejemplo Debian repositorio etc), probablemente debería considerar la posibilidad de un archivo make compilar e instalar la aplicación.

Como nota final: también se puede ir con un archivo boot (la última forma OTP) pero me parece que los muy restrictivo: un archivo de inicio ata su aplicación a específica lanzamiento de la versión de Erlang (y otras aplicaciones dependientes) . Es posible que su aplicación se pueda ejecutar en varias versiones de Erlang, pero deberá tener un proceso de compilación/publicación por separado para cada "versión de plataforma" que desee enviar.

+1

Te refieres a XYZ_app como en: "erl -boot start_sasl -s XYZ_app start", y "start" es el valor predeterminado si se omite. – Christian

+0

@Christian: buena captura ... lo actualizaré. – jldupont

+0

Los archivos de arranque no tienen que ser restrictivos. Utilizo un archivo make con un objetivo make boot que reconstruye el archivo de arranque para la distribución erlang disponible actualmente. Y los archivos de arranque hacen que comenzar un servicio sea muy fácil. –

2

Puede compilar los módulos con erlc

erlc module1 module2 module3 

También puede crear un script para ejecutar programar

#!/usr/bin/escript 

main(_) -> 
    modulen:start(). 

Luego, en la consola:

chmod +x start.erl 
./start.erl 
1

Puede usar erl -make directamente, ya que supone que todos los archivos *.erl deben compilarse en *.beam, y omitirlos si no se han modificado desde la última compilación. Consulte el make module para lo que puede poner en su Emakefile para cambiar ciertos comportamientos.

El uso de Makefile para invocar esta estrategia de compilación también proporciona a otros usuarios un procedimiento de compilación familiar.

Tener una función de inicio de arranque como lo sugiere jldupont es una buena manera de iniciar su entorno de desarrollo. Incluso es lo suficientemente fino para usarlo en producción hasta cierto punto.

El siguiente paso es utilizar archivos de versión OTP completos (*.rel) y generar scripts de arranque que inicien todas las aplicaciones en el orden en que *.app especifiquen dependencias entre sí.

2

Dos maneras

precompilación su código

 
$ erlc module1.erl 
$ erl -s module1 funcname arg1 arg2 .... 

o uso Escript

 
#!/usr/bin/env escript 
main() -> 
    module1:fun(...) 

Escript es una interfaz de secuencias de comandos para Erlang

Cuestiones relacionadas