如何在 erlang 版本中包含“.mustache”文件?

How can I include a ".mustache" file in erlang release?

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

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

如何确保 compile/release 进程捆绑 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.mustachesrc 目录:

{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, []}
 ]}.

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

Erlang/OTP应用视角

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

src - Contains the Erlang source code.
ebin - Contains the Erlang object code, the beam files. The .app file is also placed here.
priv - Used for application specific files. For example, C executables are placed here. The function code:priv_dir/1 is to be used to access this directory.
include - Used for include files

鉴于此,将非源代码的文件放在src/目录中是不合适的。 priv/ 是放置它们的正确位置。

Rebar3 透视图

The documentation of compile command in rebar3 说:

After ensuring all dependencies are available, (...) compile will compile the needed depdendencies and the project's apps .app.src and .erl files.

使用 OTP 设计原则编译。由于位于 src/ 中的小胡子文件既不是 .app.src 文件也不是 .erl 文件,因此 rebar 对它没有任何作用。

Erlang/OTP 释放透视

最后,上述 OTP 文档对 Erlang 版本的说明如下:

The directory structure for the code installed by the release handler from a release package is as follows:

$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/ 中,rebar 不会将它们复制到 ebin/。在构建一个版本时,组成它的应用程序连同它们的 priv 目录一起被复制。