我有一个我写过的erlang应用程序,它使用erldis库与redis进行通信。
作为一个真正将erlang应用程序部署到生产中的新手,我想知道是否有任何方法将这些外部库与应用程序“捆绑”,而不是安装到我的系统范围/ usr / lib / erlang / lib /文件夹。
目前我的目录结构看起来像......
\
--\conf
--\ebin
--\src
我有一个基本的Makefile,我从朋友的项目中偷走了,但我不确定如何正确地编写它们。
我怀疑这个答案可能涉及告诉我如何正确编写我的Makefile而不是只是将一些外部库代码放入哪个目录。
答案 0 :(得分:4)
你应该尽可能地避免项目嵌套。由于模块/应用程序版本在Erlang中的结构如何,它可能会导致各种问题。
在我的开发环境中,我做了一些简化依赖项和多个开发项目的事情。具体来说,我将大部分项目都保存在dev目录中,并将符号链接创建到ERL_LIBS
环境变量中设置的elibs目录中。
~/dev/ngerakines-etap
~/dev/jacobvorreuter-log_roller
~/dev/elib/etap -> ~/dev/ngerakines-etap
~/dev/elib/log_roller -> ~/dev/jacobvorreuter-log_roller
对于已部署的项目,我有package-rpm
或package-apt
制作目标,可为每个项目创建单独的包。应用程序获取启动脚本和init.d脚本以便于启动/停止控制,但库和依赖项目只是作为包依赖项列出。
答案 1 :(得分:3)
我使用mochiweb风格的风格。要查看此示例,请获取mochiweb的副本:
svn checkout http://mochiweb.googlecode.com/svn/trunk/ mochiweb
并使用
path/to/mochiweb/scripts/new_mochiweb.erl new_project_name
创建结构的示例项目(随后删除 src 中的所有内容并将其用于您的项目)。
看起来像这样:
/
/ebin/
/deps/
/src/
/include/
/support/
/support/include.mk
Makefile
start.sh
Makefile 和 include.mk 负责在项目构建时包含适当的路径。
start.sh 负责在项目运行时包含适当的路径。
因此,使用 deps 目录中的符号链接,您可以微调用于每个项目的库版本。建议使用相对路径,所以之后 rsync 这个结构足以生成服务器并运行它。
在更全球范围内,我使用以下结构:
~/code/erlang/libs/*/
~/code/category/project/*/
~/code/category/project/*/deps/*/
deps 中的每个符号链接指向〜/ code / erlang / libs / 中的库或同一类别中的另一个项目。
答案 2 :(得分:1)
最简单的方法是创建一个名为erldir的文件夹并将所需的梁放入其中,然后在启动脚本中使用-pa标志到erlang运行时指出它应该获取的位置梁。
正确的方法(至少如果您购买OTP分发模型)将使用reltool(http://www.erlang.org/doc/man/reltool.html)或systools(http://www.erlang.org/doc/man/systools.html)创建一个版本,其中包括您的应用程序和erldis。
答案 3 :(得分:1)
在您需要的任何位置添加所需的外部库,并将其添加到 ERL_LIBS 环境变量中。在dos中用unix或分号中的冒号分隔路径。
Erlang会将“ebin”-named子目录添加到其代码加载路径中。
让您的* .app文件指出它所依赖的其他应用程序。
这是设置更大应用程序的良好途径。
答案 4 :(得分:0)
另一种方法是将你的lib路径放在〜/ .erlang。
中code:add_pathz("/Users/brucexin/sources/mochiweb/ebin").
code:add_pathz("/Users/brucexin/sources/webnesia/ebin").
code:add_pathz("./ebin").
code:add_pathz("/Users/brucexin/sources/erlang-history/ebin/2.15.2").