受益于Erlang中的“.app”文件?

时间:2009-11-28 21:22:20

标签: erlang

我从未真正将.app文件用于我的项目。我理解通过application模块加载应用程序需要这些。

是否有另外使用此类文件?

2 个答案:

答案 0 :(得分:11)

* .app和* .rel文件用于生成启动脚本。启动erlang时,启动脚本用于自动启动我的应用程序。应用程序资源文件描述了在启动应用程序之前需要运行的应用程序。例如,如果我使用mnesia并在我的应用程序的.app文件中指明,当我生成启动脚本并使用它来启动我的应用程序时,它将在启动我自己的应用程序时为我启动mnesia。

虽然您可以使用其他软件包管理器进行自动依赖项安装/处理,但启动脚本对于管理应用程序启动时的依赖关系非常有用,这在OTP应用程序设置中非常重要。

注意:otp中的应用程序是指一组正在运行的进程和/或代码。应用程序可以通过多种方式依赖于其他应用程序。他们要么安装代码,要么运行应用程序。

答案 1 :(得分:8)

它们用于构建版本时(使用* .rel生成启动脚本)。我建议只从* .app文件和应用程序行为回调开始。至于从OTP开始。这是一个很好的开发中心:

-module(foo).
-export([start/0]).
start() ->
    [application:start(A) || A <- [sasl, inets, x, y, etc]].

使用简单的

启动您依赖于运行应用程序的所有应用程序
$ erl -s foo
  • 如果您的项目要用作其他项目的服务或框架,那么另一个好处是Erlang应用程序可以依赖或包含您的应用程序。 Erlang应用程序是提供服务甚至库的单元(stdlib是一个库,没有“移动部件”,只有库模块)。
  • 作为Erlang应用程序,您可以通过简单的方法将配置参数传递给应用程序。当您将-mnesia dir '"/some/path"'传递给erl时,mnesia应用程序将其作为application:get_env(mnesia, dir)进行访问。如果您定义名为foo的应用程序,则可以将-foo key 'some-Erlang-literal'传递给erl。 * .app文件可以包含env部分中的默认值,* .rel文件会覆盖它们,命令行会覆盖它们。
  • * .app文件包含列出应用程序引入的模块和注册过程的部分。在构建版本时使用此方法来检查应用程序之间是否存在冲突。

我不太了解的Erlang应用程序的一些其他功能:

  • 开始阶段。用于具有复杂启动需求的应用程序,例如暂时“部分运行”。
  • 分布式应用程序。用于定义应用程序在群集中的运行位置。
  • 接管。用于从分布式应用程序中释放计算机,例如,如果需要维护或升级。

最终,您将开始希望以更结构化的方式启动应用程序集,这就是整个发布/启动脚本变得更容易理解的时候。或者相反,你会认为这对你的具体需求来说太过分了。刚开始使用一个简单的* .app和一个带有应用程序行为回调的模块。你不会回头。