【问题标题】:Dynamically loading erlang header files动态加载erlang头文件
【发布时间】:2013-12-19 16:46:11
【问题描述】:

我知道您可以使用“l(module_name).”在 erlang 节点中动态加载 erlang 梁文件。我的问题是是否可以以相同的方式或类似的方式加载“.hrl”文件而无需重新启动 erlang 节点

【问题讨论】:

    标签: erlang


    【解决方案1】:

    我不确定这是否可能,但只是基于理解,当您尝试在 url 中定义宏并想要修改它时,编译器会在编译 erlang 文件期间通过替换宏来替换宏在标题中定义。

    从逻辑上讲,您应该重新构建代码并再次部署它。如果您可以选择动态替换整个代码,我不明白为什么需要动态加载 hrl 文件。恕我直言,您需要做的就是重建和升级,这也可以在不重新启动 erlang 节点的情况下完成。

    【讨论】:

    • 好的,我现在明白了,所以与其尝试直接加载 .hrl 文件,不如在修改 .hrl 并加载更新后的梁后重新编译 erlang 文件。由于您专门谈论宏,我是否也可以假设这也适用于 .hrl 文件中定义的“记录”?
    • 头文件,与所有编译语言一样(如果我错了,请纠正我),在编译时包含,因此构建新的 BEAM 就足够了。是的,这也适用于记录。请注意,如果您修改头文件中的记录定义,则必须重新加载包含该头文件(并使用该记录)的所有模块,以免您陷入错误匹配错误。
    【解决方案2】:

    ".hrl" 文件 - 仅由编译器在编译源上使用。它不是运行时文件。

    您可以使用 Mochi 团队流行的自动加载器 https://github.com/mochi/mochiweb/blob/master/src/reloader.erl

    将它们放入您的 src/ 文件夹并添加到您的 exec erl -s reloader 选项中

    【讨论】:

    • 啊,谢谢,现在整个事情变得更有意义了,我一直认为在运行时也需要 .hrl 文件。还是 erlang 的新手
    猜你喜欢
    • 2021-03-26
    • 2010-10-04
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多