【问题标题】:"Bundling" external libraries in Erlang?在 Erlang 中“捆绑”外部库?
【发布时间】:2013-02-24 08:53:06
【问题描述】:

我有一个我一直在编写的 erlang 应用程序,它使用 erldis 库与 redis 通信。

作为一个实际将 erlang 应用程序部署到生产环境的新手,我想知道是否有办法将这些外部库与应用程序“捆绑”在一起,而不是安装到我的系统范围内的 /usr/lib/erlang/lib /文件夹。

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

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

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

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您真的应该尽可能避免项目嵌套。由于模块/应用程序版本在 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 脚本,以便轻松启动/停止控制,但库和依赖项项目只是作为包依赖项列出。

    【讨论】:

      【解决方案2】:

      我使用 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 包含指向依赖项根目录的符号链接

      Makefileinclude.mk 负责在构建项目时包含适当的路径。

      start.sh 负责在项目运行时包含适当的路径。

      因此,使用 deps 目录中的符号链接,您可以微调用于每个项目的库版本。建议使用相对路径,所以之后将这个结构 rsync 到生产服务器并运行它就足够了。

      在全球范围内,我使用以下结构:

      ~/code/erlang/libs/*/
      ~/code/category/project/*/
      ~/code/category/project/*/deps/*/
      

      deps 中的每个符号链接都指向 ~/code/erlang/libs/ 中的库或同一类别中的另一个项目。

      【讨论】:

        【解决方案3】:

        最简单的方法是创建一个名为 erldir 的文件夹并将您需要的梁放入其中,然后在您的启动脚本中使用 erlang 运行时的 -pa 标志来指出它应该在哪里获取梁。

        正确的方法(至少如果您购买 OTP 分发模型)是使用 reltool (http://www.erlang.org/doc/man/reltool.html) 或 systools (http://www.erlang.org/doc/man/systools.html) 创建一个版本,其中包括您的应用程序和 erldis。

        【讨论】:

          【解决方案4】:

          在您想要的任何位置添加您需要的外部库,并将它们添加到您的 ERL_LIBS 环境变量中。 unix 用冒号分隔路径,dos 用分号分隔。

          Erlang 会将“ebin”命名的子目录添加到其代码加载路径中。

          让您的 *.app 文件指出它所依赖的其他应用程序。

          这是设置大型应用程序的一种很好的中途方法。

          【讨论】:

            【解决方案5】:

            另一种方法是将你的 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").
            

            【讨论】:

              猜你喜欢
              • 2017-09-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-27
              • 1970-01-01
              • 1970-01-01
              • 2017-05-16
              • 1970-01-01
              相关资源
              最近更新 更多