2009-12-08 13 views
9

Per iniziare il mio programma che faccio la sequenza successiva:Erlang - script di avvio

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

C'è la possibilità di creare script che mi permetta di lanciare il mio programma?

risposta

12

Si potrebbe usare uno script del caricatore che si occupa di avviare l'applicazione in modalità OTP:

-module(XYZ_app). 

-export([start/0]). 

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

Si avvia quello script tramite uno script di shell. Attenzione all'utilizzo di escript se si pianifica la costruzione di demoni in esecuzione all'avvio del sistema operativo poiché sono complessi.

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

Naturalmente è necessario il vostro XYZ.app di file (solo un esempio):

{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, []}}]}. 

... e tutti i file .erl deve essere compilato.

Nota che se avete intenzione di distribuire l'applicazione (ad esempio Debian repository ecc), probabilmente si dovrebbe considerare la possibilità di un file make per compilare ed installare la vostra applicazione.

Come nota finale: si potrebbe anche andare con un file boot (il modo migliore OTP) ma trovo quelli molto limitante: un file di avvio lega l'applicazione per versione specifica versione di Erlang (e altre applicazioni dipendenti) . La tua applicazione potrebbe essere in grado di funzionare in varie versioni di Erlang, ma dovrai eseguire un processo di compilazione/rilascio separato per ogni "rilascio di piattaforma" che intendi effettuare.

+1

Intendi XYZ_app come in: "erl -boot start_sasl -s XYZ_app start", e 'start' è l'impostazione predefinita se omessa. – Christian

+0

@Christian: buona cattura .. aggiornerò. – jldupont

+0

I file di avvio non devono essere vincolanti. Io uso un file make con un make boot target che ricostruisce il file di boot per la distribuzione di erlang attualmente disponibile. E i file di avvio non rendono facile l'avvio di un servizio. –

2

È possibile compilare i moduli con erlc

erlc module1 module2 module3 

È inoltre possibile creare uno script da eseguire si programma

#!/usr/bin/escript 

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

Poi nella console:

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

È possibile utilizzare direttamente erl -make, poiché si presuppone che tutti i file *.erl debbano essere compilati su *.beam e saltarli se non sono stati modificati dall'ultima compilazione. Controlla lo make module per ciò che puoi inserire nel tuo Emakefile per modificare determinati comportamenti.

L'utilizzo di plain Makefile per richiamare questa strategia di compilazione offre anche agli altri utenti una procedura di compilazione familiare.

Avere una funzione di bootstrap start come suggerisce jldupont è un buon modo per avviare il proprio ambiente di sviluppo. Ad un certo punto è persino sufficientemente fine per l'utilizzo in produzione.

Il passaggio successivo consiste nell'utilizzare i file di rilascio OTP (*.rel) completi e generare script di avvio che avviino tutte le applicazioni nell'ordine in cui lo *.app specifichi dipendenze reciproche.

2

Due modi

precompilare il codice

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

o utilizzare EScript

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

EScript è un'interfaccia di scripting per Erlang

Problemi correlati