为什么需要在项目的应用程序中列出库依赖项?
Why do library dependencies need to be listed in a project's applications?
将库依赖项(仅提供功能)列为应用程序的目的是什么?
例如,left_pad项目建议在仅提供简单功能时将其作为应用收录。
def application do
[applications: [:left_pad]]
end
Elixir 包是否应该始终作为应用程序提供?新的库开发人员如何使他们的依赖项作为应用程序可用?这还提供了哪些其他功能?
每个运行时依赖项都应添加到应用程序列表中。一个包是只提供功能还是运行进程是一个实现细节,用户不应该关心。
此外,由于 Erlang 可以即时加载代码,据我所知,将应用程序添加到依赖项列表可确保模块以正确的顺序加载。这在不属于您的应用程序的模块或任何依赖项根本不包含在发布中的版本中尤为重要。
关于为什么有两个地方定义依赖的问题:deps
和applications
:
deps
- 主要是关于你需要从别处获取的包和代码
applications
- 关于 runtime 依赖项。您可能会在 deps
中声明一些仅编译时的依赖项,但由于它不是运行时依赖项,因此不需要包含在 applications
. 中
看看这个问题:Specifying app startup order with erlang.mk
基本上,您的应用程序依赖的所有应用程序都保证在您的应用程序启动之前启动。
但是,如果您的应用程序中的一个函数调用了尚未加载的模块中的另一个函数,并且该模块位于从 get_path/0
返回的路径之一中,则 VM 将自动加载无论如何那个模块。
但是,在使用发布处理程序进行发布时(请参阅 this question for more information and also Erlang's official documentation),只有特定的应用程序会进入发布版本 - 您在 reltool.config
中明确指定的应用程序以及依赖于.如果您的应用程序使用库应用程序并且您既没有在应用程序文件中也没有在发布配置文件中列出它,那么它不会被部署到生产系统并且您的应用程序将无法从图书馆申请。
是的,正如 michalmuskala 所指出的,依赖项列表也是发布处理程序在计算重新加载模块的顺序时要考虑的一个因素使用 release handler.
升级版本
所以,总而言之,它在开发环境中并不那么重要,但它是一个很好的做法,如果您在将内容部署到生产环境时进行适当的 Erlang 发布,则它是必需的。
将库依赖项(仅提供功能)列为应用程序的目的是什么?
例如,left_pad项目建议在仅提供简单功能时将其作为应用收录。
def application do
[applications: [:left_pad]]
end
Elixir 包是否应该始终作为应用程序提供?新的库开发人员如何使他们的依赖项作为应用程序可用?这还提供了哪些其他功能?
每个运行时依赖项都应添加到应用程序列表中。一个包是只提供功能还是运行进程是一个实现细节,用户不应该关心。
此外,由于 Erlang 可以即时加载代码,据我所知,将应用程序添加到依赖项列表可确保模块以正确的顺序加载。这在不属于您的应用程序的模块或任何依赖项根本不包含在发布中的版本中尤为重要。
关于为什么有两个地方定义依赖的问题:deps
和applications
:
deps
- 主要是关于你需要从别处获取的包和代码applications
- 关于 runtime 依赖项。您可能会在deps
中声明一些仅编译时的依赖项,但由于它不是运行时依赖项,因此不需要包含在applications
. 中
看看这个问题:Specifying app startup order with erlang.mk
基本上,您的应用程序依赖的所有应用程序都保证在您的应用程序启动之前启动。
但是,如果您的应用程序中的一个函数调用了尚未加载的模块中的另一个函数,并且该模块位于从 get_path/0
返回的路径之一中,则 VM 将自动加载无论如何那个模块。
但是,在使用发布处理程序进行发布时(请参阅 this question for more information and also Erlang's official documentation),只有特定的应用程序会进入发布版本 - 您在 reltool.config
中明确指定的应用程序以及依赖于.如果您的应用程序使用库应用程序并且您既没有在应用程序文件中也没有在发布配置文件中列出它,那么它不会被部署到生产系统并且您的应用程序将无法从图书馆申请。
是的,正如 michalmuskala 所指出的,依赖项列表也是发布处理程序在计算重新加载模块的顺序时要考虑的一个因素使用 release handler.
升级版本所以,总而言之,它在开发环境中并不那么重要,但它是一个很好的做法,如果您在将内容部署到生产环境时进行适当的 Erlang 发布,则它是必需的。