如何在 erlang 版本中包含“.mustache”文件?
How can I include a ".mustache" file in erlang release?
我正在尝试将 mustache erlang 库与单独的模板和视图一起使用。我正在使用 rebar3 发布结构。
如果我同时创建 simple.erl
和 simple.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.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, []}
]}.
只有 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
目录一起被复制。
我正在尝试将 mustache erlang 库与单独的模板和视图一起使用。我正在使用 rebar3 发布结构。
如果我同时创建 simple.erl
和 simple.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.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, []}
]}.
只有 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
目录一起被复制。