在Erlang中“捆绑”外部库?

时间:2009-11-24 08:11:12

标签: erlang

我有一个我写过的erlang应用程序,它使用erldis库与redis进行通信。

作为一个真正将erlang应用程序部署到生产中的新手,我想知道是否有任何方法将这些外部库与应用程序“捆绑”,而不是安装到我的系统范围/ usr / lib / erlang / lib /文件夹。

目前我的目录结构看起来像......

\
--\conf
--\ebin
--\src

我有一个基本的Makefile,我从朋友的项目中偷走了,但我不确定如何正确地编写它们。

我怀疑这个答案可能涉及告诉我如何正确编写我的Makefile而不是只是将一些外部库代码放入哪个目录。

5 个答案:

答案 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-rpmpackage-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
  • ebin 包含* .beam文件
  • src 包含***。erl文件和本地 * .hrl文件
  • include 包含全球 * .hrl文件
  • deps 包含依赖项根目录的符号链接

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").