在Erlang应用程序中加载依赖项的代码路径的正确方法是什么?



所以假设我有一个钢筋应用程序结构和在deps文件夹我有一些依赖关系,有些是库应用程序,有些是需要启动的应用程序。我通常是这样做的:

start(_Type, _Args) ->
   code:add_path("../deps/depapp/ebin"),
   {ok, _} = application:ensure_all_started(depapp),

在开发环境中这样做是正确的吗?在生产中呢?

您使用的方法不一定是错误的,但可能暴露出一些问题。例如,你没有选择启动依赖的应用程序,必须在你的应用程序之前启动。

因此,对于依赖于loadingstarting的OTP应用程序或库,还有其他替代方案。

1)使用erl命令行标志:

erl -pa ebin deps/*/ebing -s your_dep_app start -s your_app start

2)使用包管理器来处理它:

作为一个例子,Rebar作为一个包管理器可以为你处理它。您需要的是在rebar.config中指定应用程序依赖项,然后为Rebar2发出rebar get-deps或为Rebar3发出rebar3 compile。以下是Rebar3的配置文件示例片段:
{deps,[
  %% Packages
  rebar,
  {rebar,"1.0.0"},
  {rebar, {pkg, rebar_fork}}, % rebar app under a different pkg name
  {rebar, "1.0.0", {pkg, rebar_fork}},
  %% Source Dependencies
  {rebar, {git, "git://github.com/erlang/rebar3.git"}},
  {rebar, {git, "http://github.com/erlang/rebar3.git"}}]}.

有关钢筋依赖管理器的更多信息,请查看此链接。

对于使用Rebar启动或加载它们,您可以创建一个release并让Rebar启动或加载它们。下面是一个用于发布的示例Rebar配置文件的片段:

{relx, [
    {release, 
    {your_app, "0.1.0"},
        [your_dep_app_1,
         {your_dep_app_2, load}]}]}.

该配置加载并启动your_dep_app_1,但只加载your_dep_app_2。有关钢筋发布管理器的更多信息,请查看此链接

最新更新