【问题标题】:How to load the resource file in Erlang如何在 Erlang 中加载资源文件
【发布时间】:2019-02-01 13:32:14
【问题描述】:

在 Erlang 中存储和加载资源文件的常用方法是什么。我需要创建一个特定的人类可读字典并在应用程序初始化时加载它。例如,在 Java 中,我会将数据放在 .property 文件中,然后将其放在 classpath 中的某个位置,最后借助如下代码加载它:

new Properties().load(Class.getResourceAsStream("/file.properties"))

所以,我有以下问题:

  • 我可以(必须)将资源文件保存在哪里?
  • 如何在运行时确定资源文件的路径
  • 如何加载(例如file:consult(Filename)

【问题讨论】:

    标签: erlang


    【解决方案1】:

    在 Erlang 中,属性位于 *.config 文件中,通常(但不一定)在项目的根目录中。例如:

    • Chicago Boss 有 boss.config
    • RabbitMQ 有 rabbitmq.config
    • Zotonic 对不同的站点有不同的配置存储在 priv/sitename/config 中

    你可以通过运行提供配置文件

    erl -config myconfig
    

    警告:该文件应命名为“myconfig.config”并且您应该省略扩展名。

    配置文件的结构应该是这样的:

    [{Application1, [{Par11,Val11},...]},
     ...,
    {ApplicationN, [{ParN1,ValN1},...]}].
    

    例如:

    [{kernel, [
        {my_key, "value"}
    ]}].
    

    比在 erlang shell 中,你可以输入:

    application:get_env(kernel, my_key).
    {ok,"value"}
    

    我使用内核应用程序,因为它总是被加载并且 application:get_env/2 返回 undefined,如果应用程序没有加载。您应该将所有配置放在您自己的应用程序中,并确保在调用 get_env/2 之前加载它。

    此外,配置是分层的,您可以将默认设置放在 *.app 文件中,用户通常不必修改。您可以在配置文件中覆盖它们,最后,您可以在命令行中提供键值对(它们将覆盖配置文件中的内容)。

    您可以在此处阅读有关配置的更多信息:

    http://www.erlang.org/doc/design_principles/applications.html#id74398

    您还可以使用 cmets 使配置文件更加用户友好,例如:

    https://github.com/ChicagoBoss/ChicagoBoss/blob/master/skel/boss.config

    【讨论】:

      【解决方案2】:

      我自己找到了答案。存储资源文件的首选路径是priv 目录。 code:priv_dir/1 返回应用程序中priv 目录的路径。

      这是从文件中加载 JSON 的代码 sn-p:

      File = filename:join([code:priv_dir(application), "resource.json"]),
      {ok, Text} = file:read_file(File),
      %% parse json
      

      【讨论】:

      • 这适用于静态资源,例如 html 模板、css 文件、图像等。对于用户可以更改的动态配置,最好使用 *.config,正如我在回答中指出的那样,但如果您的资源是静态的,那么您是对的。
      猜你喜欢
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 2011-03-27
      • 2013-03-22
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多