Erlang:* .hrl文件在多个应用程序中的位置

时间:2013-07-08 14:48:00

标签: erlang records

我正在开发一系列相关的应用程序,最终将集成到单个版本中。其中一些应用程序共享相同的记录结构。

我应该:

a)复制在每个应用程序的include目录中定义记录结构的* .hrl文件? b)在我的应用程序树中的其他地方放一个文件---如果是这样的话,在哪里?

这是我当前的树:

zpt$
   apps
       app1
          ebin
          include
             myrecords.hrl
          priv
          src
       app2
          ebin
          include
             myrecords.hrl
          priv
          src
       etc

非常感谢,

LRP

1 个答案:

答案 0 :(得分:4)

我尝试过的一种方法是创建一个不做任何事情的应用程序,但包含多个项目共有的记录定义。然后我使用rebar将它作为依赖项包含在内。包含hrl文件时,我使用include_lib语法。该语法允许您包含来自其他应用程序的hrl文件。

app
    ebin
    include
    priv
    src
        some_src.erl
    deps
        common_hrl_app
            include
                common_records.hrl
            src
            ebin
        other_dep_app
            src
                other_src.erl
            .
            .
            .

include_lib示例可能出现在some_src.erl或other_src.erl中:

-include_lib("common_hrl_app/include/common_records.hrl").

我喜欢这种方法,因为:

  1. 它与钢筋依赖系统很好地配合使用
  2. 它允许我在版本控制中的一个地方跟踪hrls
  3. 我可以对此应用程序进行版本控制,如果我希望新应用程序与使用相同记录的其他应用程序兼容,则可以提取特定版本。

  4. 回答评论中的问题:

    我在ebin目录中有一个骨架应用程序文件,它指定了应用程序的名称和版本,因此rebar可以验证版本。这是一个例子

    {application,common_hrl_app,
             [{description,[]},
              {vsn,"1"},
              {registered,[]},
              {applications,[kernel,stdlib]},
              {env,[]},
              {modules,[]}]}.
    

    使用rebar,您拥有顶级应用程序,可以将多个应用程序作为依赖项。当rebar获取这些依赖项时,它会将它们放在deps目录中。如果这些应用程序中的任何一个具有自己的依赖项,那么它们也会被提取到deps目录,依此类推。没有无限嵌套的deps目录层次结构。