为什么库依赖项需要在项目的应用程序中列出?

时间:2016-03-27 15:02:24

标签: elixir otp

库依赖项(仅提供函数)被列为应用程序的目的是什么?

例如,left_pad项目建议在仅提供简单功能时将其作为应用程序包含。

def application do
  [applications: [:left_pad]]
end

Elixir软件包是否应始终作为应用程序提供?新的库开发人员如何使其依赖项可用作应用程序?这提供了哪些其他功能?

2 个答案:

答案 0 :(得分:5)

看看这个问题:Specifying app startup order with erlang.mk

基本上,您的应用程序所依赖的所有应用程序都保证在您的应用程序启动之前启动。

但是,如果应用程序中的某个函数调用尚未加载的模块中的另一个函数,并且该模块位于从get_path/0返回的其中一个路径中,则VM将自动加载该模块反正。

但是,在使用发布处理程序执行发布时(请参阅this question以获取更多信息以及Erlang's official documentation),只有特定的应用程序才会进入发布版本 - 您在{{1和那些依赖的人。如果您的应用程序使用库应用程序并且您既未在应用程序文件中也未在发布配置文件中列出它,则它将不会部署到生产系统,并且您的应用程序将无法从该应用程序调用该函数。图书馆申请。

是的,正如 michalmuskala 所指出的,依赖列表也是发布处理程序在计算使用{{升级版本时重新加载模块的顺序时要考虑的因素。 3}}

总而言之,它在开发环境中并不重要,但它是一个很好的实践,如果你在将东西部署到生产环境时正在进行适当的Erlang发布,那就是必需的。

答案 1 :(得分:4)

应将每个运行时依赖项添加到应用程序列表中。包是否仅提供函数或运行进程是一个与用户无关的实现细节。

此外,由于Erlang可以即时加载代码,因此我理解将应用程序添加到依赖项列表可确保以正确的顺序加载模块。这在不属于您的应用程序或任何依赖项的模块根本不包含在发行版中的版本中尤为重要。

关于为什么有两个地方你定义依赖关系的问题:depsapplications

  • deps - 主要是关于您需要从其他地方获取的包和代码
  • applications - 关于运行时依赖项。您可能会在deps中声明一些仅编译时的依赖项,但由于它不是运行时依赖项,因此不需要包含在applications中。