返回首页
当前位置: 主页 > erlang >

使用target_system进行erlang应用的发行

时间:2009-05-02 13:21来源:javaeye.com 作者:AvinDev 点击:
好久之前捣鼓过的东西,怕忘记了,记录一下。 一个简单实现了OTP的Server:echoline,一个Helloworld级别的OTP应用,目录结构如下: ./src/echoline_app.erl ./src/echoline_sup.erl ./src/echoline_server.er
  

好久之前捣鼓过的东西,怕忘记了,记录一下。

一个简单实现了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 内容如下:
 

Java代码 复制代码
  1. {'src/*', [debug_info,{i,'include'},{outdir,'ebin'}]}.  



echoline_app.app 内容如下:
 

Java代码 复制代码
  1. {application, echoline_app,    
  2.  [{description, "Echoline Server"},   
  3.   {vsn, "1"},   
  4.   {modules, [echoline_app, echoline_sup, echoline_server, tcp_server]},   
  5.   {registered, []},   
  6.   {applications, [kernel, stdlib, sasl]},   
  7.   {mod, {echoline_app,[]}}   
  8.  ]}.  



但是这个应用仅仅只能在安装了Erlang的环境下启动。这时候可以这样:
 

引用
erl -pa ./ebin
1> application:load(echoline).
ok
 


来加载这个应用。

接下来,可以生成一个Release,它需要echoline_rel.rel这个文件,内容为:
 

Java代码 复制代码
  1. {release,   
  2.  {"echoline_rel""1"},   
  3.  {erts, "5.5.4"},   
  4.  [{kernel, "2.11.4"},   
  5.   {stdlib, "1.14.4"},   
  6.   {sasl, "2.1.5"},   
  7.   {echoline_app, "1"}]   
  8. }.  


注意,上面的模块版本以实际为主,我用的是R11B-4。而且{echoline, "1"}这句的 版本号,app名称 要跟echoline.app一致。

接着运行这两步就可以生成能够用于分发的release:

 

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



程序会在根目录下面生成
echoline_rel.boot
echoline_rel.script
echoline_rel.tar.gz
三个文件。这个tar.gz可以直接用于部署到其他机器上面。
同时,还能够以
 

引用
erl -boot echoline_rel


这种方式启动应用。

但是这样还不够彻底,在没有Erlang的机器上面,最起码还得安装上一个CEAN才能启动这个应用,好在文档的《System Principles》中提供了一个target_system,使得生成应用的发行版本成为可能。

按照文档创建一个target_system.erl,windows下需要将:
 

Java代码 复制代码
  1. copy_file(filename:join([ErtsBinDir, "epmd"]),    
  2.           filename:join([TmpBinDir, "epmd"]), [preserve]),   
  3. copy_file(filename:join([ErtsBinDir, "run_erl"]),    
  4.           filename:join([TmpBinDir, "run_erl"]), [preserve]),   
  5. copy_file(filename:join([ErtsBinDir, "to_erl"]),    
  6.           filename:join([TmpBinDir, "to_erl"]), [preserve]),  


改为
 

Java代码 复制代码
  1. copy_file(filename:join([ErtsBinDir, "epmd.exe"]),    
  2.           filename:join([TmpBinDir, "epmd.exe"]), [preserve]),   
  3. copy_file(filename:join([ErtsBinDir, "start_erl.exe"]),    
  4.           filename:join([TmpBinDir, "start_erl.exe"]), [preserve]),   
  5. copy_file(filename:join([ErtsBinDir, "werl.exe"]),    
  6.           filename:join([TmpBinDir, "werl.exe"]), [preserve]),  


因为windows下的启动程序跟linux下有所不同。

编译,然后运行:

 

引用
erl -pa ./ebin/



 

引用
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



它在根目录下生成了这些文件:
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来安装应用。 
 

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
发布者资料
amw 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:2009-03-30 13:03 最后登录:2012-01-17 11:01
推荐内容