【问题标题】:Why do library dependencies need to be listed in a project's applications?为什么需要在项目的应用程序中列出库依赖项?
【发布时间】:2016-03-29 22:25:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: elixir erlang-otp


    【解决方案1】:

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

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

    但是,如果您的应用程序中的一个函数调用了一个尚未加载的模块中的另一个函数,并且该模块位于从 get_path/0 返回的路径之一中,那么 VM 无论如何都会自动加载该模块。

    但是,当使用发布处理程序进行发布时(有关更多信息,请参阅 this question 以及 Erlang's official documentation),只有特定的应用程序才会进入发布 - 您在 reltool.config 中明确指定的应用程序以及那些依赖于。如果您的应用程序使用库应用程序,并且您既没有在应用程序文件中也没有在发布配置文件中列出它,那么它将不会部署到生产系统并且您的应用程序将无法从图书馆申请。

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

    所以,总而言之,它在开发环境中并不重要,但它是一个很好的做法,如果您在将东西部署到生产环境时进行适当的 Erlang 版本,则它是必需的。

    【讨论】:

      【解决方案2】:

      每个运行时依赖项都应该添加到应用程序列表中。一个包是只提供函数还是运行进程是用户不应该关心的实现细节。

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

      关于为什么有两个地方定义依赖的问题:deps和applications:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 2020-03-09
        相关资源
        最近更新 更多