2

我正在尝试将mustache erlang lib 与单独的模板和视图一起使用。我正在使用 rebar3 发布结构。

simple.erl如果我同时创建和,我会按照文档中的示例进行操作simple.mustache。但是,当我执行时rebar3 compile,我的最终 ebin 目录仅包含simple.beam.

如何确保编译/发布过程捆绑simple.mustache文件?

这是我的应用程序的布局:

在此处输入图像描述

这是我的 rebar.config:

{erl_opts, [debug_info]}.
{deps, [
    {cowboy, {git, "git://github.com/ninenines/cowboy.git", {tag, "1.0.1"}}},
  {mustache, {git, "git@github.com:mojombo/mustache.erl.git", {tag, "v0.1.1"}}}
]}.

{relx, [{release, { kitty, "0.1.0" },
         [kitty,
          kitty_api,
          sasl]},

        {sys_config, "./config/sys.config"},
        {vm_args, "./config/vm.args"},

        {dev_mode, true},
        {include_erts, false},

        {extended_start_script, true}]
}.

{profiles, [{prod, [{relx, [{dev_mode, false},
                            {include_erts, true}]}]
            }]
}.

这是我的kitty_api_app.src,其中包含simple.mustache在它的src目录中:

{application, kitty_api,
 [{description, "Kitty HTTP API"},
  {vsn, "0.1.0"},
  {registered, []},
  {mod, { kitty_api_app, []}},
  {applications,
   [kernel,
    stdlib,
    kitty,
    cowboy
   ]},
  {env,[]},
  {modules, []},

  {maintainers, []},
  {licenses, []},
  {links, []}
 ]}.
4

2 回答 2

4

Erlang/OTP 应用视角

根据 OTP 设计原则中的目录结构章节,Erlang 应用程序包含以下子目录:

src - 包含 Erlang 源代码。
ebin - 包含 Erlang 目标代码,梁文件。.app 文件也放在这里。
priv - 用于特定于应用程序的文件。例如,C 可执行文件放在此处。功能代码:priv_dir/1 用于访问该目录。
include - 用于包含文件

面对这种情况,将不是源代码的文件放到目录中是不合适的src/。priv/ 是放置它们的正确位置。

Rebar3 透视图

rebar3 中的编译命令文档说:

在确保所有依赖项都可用后, (...) compile 将编译所需的依赖项和项目的应用程序 .app.src 和 .erl 文件

它符合 OTP 设计原则。由于您的 mustache 文件src/既不是.app.src文件也不是 .erl 文件,因此 rebar 对它没有任何作用。

Erlang/OTP 发布观点

最后,前面提到的 OTP 文档说明了 Erlang 版本:

发布处理程序从发布包安装的代码的目录结构如下:

$ROOT/lib/App1-AVsn1/ebin  
                    /priv  
        /App2-AVsn2/ebin
                   /priv
        ...
       /AppN-AVsnN/ebin
                  /priv
       /erts-EVsn/bin
       /releases/Vsn
       /bin

正如您所看到的,只有ebin/并且priv/应该被放置在作为发布的一部分的应用程序中 - 因此将您的.mustache文件保留在其中src/不是一种选择。

结论

这些.mustache文件应被视为特定于应用程序的文件,因此应放在应用程序priv/目录中。如果放置在 中src/,钢筋不会将它们复制到ebin/. 构建版本时,它所组成的应用程序将与其priv目录一起复制。

于 2016-03-26T16:26:21.100 回答
2

只有beam文件和app/appup文件应该真正在ebin文件夹中。你能把.mustache文件放在priv文件夹里吗?文件夹priv应自动复制。除非预计.mustache文件应该先编译为.erl文件,然后再编译为文件,beam因为其他一些不完全是.erl文件的 Erlang 相关源文件就是这种情况。我对 Erlang 的移植不太了解,mustache但看起来它正在尝试以非标准方式做某事,这可能无法跨系统和发布工具移植。

于 2016-03-26T10:01:26.580 回答