【问题标题】:How can I include a ".mustache" file in erlang release?如何在 erlang 版本中包含“.mustache”文件?
【发布时间】:2016-07-13 22:04:45
【问题描述】:

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

如果我同时创建 simple.erlsimple.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,它在src 目录中包含simple.mustache

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

【问题讨论】:

    标签: erlang rebar relx


    【解决方案1】:

    Erlang/OTP 应用视角

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

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

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

    Rebar3 透视图

    The documentation of compile command in rebar3 说:

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

    符合 OTP 设计原则。由于位于 src/ 中的 mustache 文件既不是 .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/ 中,rebar 不会将它们复制到ebin/。构建版本时,它所包含的应用程序将与其priv 目录一起复制。

    【讨论】:

    • 所以priv/blah.mustache 将在code:priv_name(myapp) 下可用? erlang.org/doc/man/code.html#priv_dir-1
    • 是的,试试这个:code:priv_dir(mustache).code:priv_dir(cowboy).
    • 是的。这应该在您的版本中起作用。但是请注意,如果您在未发布的情况下启动系统,例如erl -pa ebin/,那么它将无法正常工作。在这种情况下,您必须提供代码路径为erl -pa ../YOUR_APP/ebin
    【解决方案2】:

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

    【讨论】:

    • 是的,问题是mustache lib 期望它以某种方式在根目录中可用...
    • 检查文件所在的路径是否在代码根目录中:rp(code:get_path()). 如果不是,则添加 code:add_path/1 erlang.org/doc/man/code.html#add_path-1
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多