【发布时间】:2011-06-20 14:29:27
【问题描述】:
我正在研究一个问题的解决方案,这需要更改模块 gb_trees 的一项功能。
我在编译 gb_trees 的编辑版本时遇到错误:
1> c(gb_trees).
cannot write to .bea#
...
2>
我可以通过什么方式进行更改和编译已经存在的模块?
【问题讨论】:
标签: erlang erlang-otp
我正在研究一个问题的解决方案,这需要更改模块 gb_trees 的一项功能。
我在编译 gb_trees 的编辑版本时遇到错误:
1> c(gb_trees).
cannot write to .bea#
...
2>
我可以通过什么方式进行更改和编译已经存在的模块?
【问题讨论】:
标签: erlang erlang-otp
您的文件可能正被另一个进程使用。关闭所有正在使用的应用程序或重新启动操作系统,然后尝试重新编译。
您正在尝试手动加载模块,它是 Erlang/OTP 的一部分。
来自文档:
Erlang 运行时系统是 保护你。
最简单的解决方案是重命名您的 模块,例如到 mysets.erl。也是 可以“解除”目录 包含库模块。
还有:
为了防止意外重新加载 影响 Erlang 运行时的模块 系统本身,
kernel、stdlib和compiler目录被考虑 粘性。这意味着系统 发出警告并拒绝 请求用户是否尝试重新加载 驻留在其中的任何一个模块。这 功能可以通过使用禁用 命令行标志-nostick。
见erl(1)。
例如:
$ erl -nostick
Eshell V5.7.3 (abort with ^G)
1> c(gb_trees).
{ok,gb_trees}
2> gb_trees:module_info().
[{exports,[{foo,2},{module_info,0},{module_info,1}]},
{imports,[]},
{attributes,[{vsn,[338095567601101424197378397768992511838]}]},
{compile,[{options,[]},
{version,"4.6.3"},
{time,{2011,2,3,11,39,53}},
{source,"/tmp/gb_trees.erl"}]}]
3>
你看到我们可以编译模块并将其加载到 VM 中。
但是,您可以将模块 gb_trees 重命名为 gb_trees_mine 并使用它导出的函数:
1> gb_trees_mine:foo(13,42).
bar
2>
【讨论】: