使用target_system進行erlang應用的發行

好久之前搗鼓過的東西,怕忘記了,記錄一下。

一個簡單實現了OTP的Server:echoline,一個Helloworld級別的OTP應用,目錄結構如下:

./src/echoline_app.erl
./src/echoline_sup.erl
./src/echoline_server.erl
./src/tcp_server.erl
./ebin/echoline_app.app
./priv/
./include/
./echoline_rel.rel
./Emakefile

這是一個普通的Erlang應用,可以直接使用 erl -make 來編譯, Emakefile 內容如下:
[code]{'src/*', [debug_info,{i,'include'},{outdir,'ebin'}]}.[/code]

echoline_app.app 內容如下:
[code]{application, echoline_app,
[{description, "Echoline Server"},
{vsn, "1"},
{modules, [echoline_app, echoline_sup, echoline_server, tcp_server]},
{registered, []},
{applications, [kernel, stdlib, sasl]},
{mod, {echoline_app,[]}}
]}.[/code]

但是這個應用僅僅只能在安裝了Erlang的環境下啓動。這時候可以這樣:
[quote]erl -pa ./ebin
1> application:load(echoline).
ok
[/quote]
來加載這個應用。

接下來,可以生成一個Release,它需要echoline_rel.rel這個文件,內容爲:
[code]{release,
{"echoline_rel", "1"},
{erts, "5.5.4"},
[{kernel, "2.11.4"},
{stdlib, "1.14.4"},
{sasl, "2.1.5"},
{echoline_app, "1"}]
}.
[/code]
注意,上面的模塊版本以實際爲主,我用的是R11B-4。而且{echoline, "1"}這句的 版本號,app名稱 要跟echoline.app一致。

接着運行這兩步就可以生成能夠用於分發的release:

[quote]2> systools:make_script("echoline_rel", [local]).
ok
3> systools:make_tar("echoline_rel").
ok[/quote]

程序會在根目錄下面生成
echoline_rel.boot
echoline_rel.script
echoline_rel.tar.gz
三個文件。這個tar.gz可以直接用於部署到其他機器上面。
同時,還能夠以
[quote]erl -boot echoline_rel[/quote]
這種方式啓動應用。

但是這樣還不夠徹底,在沒有Erlang的機器上面,最起碼還得安裝上一個CEAN才能啓動這個應用,好在文檔的《System Principles》中提供了一個target_system,使得生成應用的發行版本成爲可能。

按照文檔創建一個target_system.erl,windows下需要將:
[code] copy_file(filename:join([ErtsBinDir, "epmd"]),
filename:join([TmpBinDir, "epmd"]), [preserve]),
copy_file(filename:join([ErtsBinDir, "run_erl"]),
filename:join([TmpBinDir, "run_erl"]), [preserve]),
copy_file(filename:join([ErtsBinDir, "to_erl"]),
filename:join([TmpBinDir, "to_erl"]), [preserve]),[/code]
改爲
[code] copy_file(filename:join([ErtsBinDir, "epmd.exe"]),
filename:join([TmpBinDir, "epmd.exe"]), [preserve]),
copy_file(filename:join([ErtsBinDir, "start_erl.exe"]),
filename:join([TmpBinDir, "start_erl.exe"]), [preserve]),
copy_file(filename:join([ErtsBinDir, "werl.exe"]),
filename:join([TmpBinDir, "werl.exe"]), [preserve]),[/code]
因爲windows下的啓動程序跟linux下有所不同。

編譯,然後運行:

[quote]erl -pa ./ebin/[/quote]

[quote]Eshell V5.5.4 (abort with ^G)
1> target_system:create("echoline_rel").
Reading file: "echoline_rel.rel" ...
Creating file: "plain.rel" from "echoline_rel.rel" ...
Making "plain.script" and "plain.boot" files ...
Making "echoline_rel.script" and "echoline_rel.boot" files ...
Creating tar file "echoline_rel.tar.gz" ...
Creating directory "tmp" ...
Extracting "echoline_rel.tar.gz" into directory "tmp" ...
Deleting "erl" and "start" in directory "tmp/erts-5.5.4/bin" ...
Creating temporary directory "tmp/bin" ...
Copying file "plain.boot" to "tmp/bin/start.boot" ...
Copying files "epmd", "run_erl" and "to_erl" from
"tmp/erts-5.5.4/bin" to "tmp/bin" ...
Creating "tmp/releases/start_erl.data" ...
Recreating tar file "echoline_rel.tar.gz" from contents in directory "tmp" ...
Removing directory "tmp" ...
ok[/quote]

它在根目錄下生成了這些文件:
echoline_rel.boot
echoline_rel.script
echoline_rel.tar.gz
plain.boot
plain.rel
plain.script

將 echoline_rel.tar.gz 解壓到某個目錄下,比如 C:\echoline,就可以用
C:\echoline>erts-5.5.4\bin\erl.exe -boot .\releases\1\start
來啓動這個應用。

p.s,target_system在windows下還有一些問題,比如不能用target_system:install來安裝應用。
發佈了3 篇原創文章 · 獲贊 0 · 訪問量 1242
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章