(金庆的专栏 2016.8)
参考:
https://docs.ejabberd.im/developer/modules/
运行
ejabberdctl modules_update_specs
会创建 C:\.ejabberd-modules\source\, 其中下载了
https://github.com/processone/ejabberd-contrib
可以同样在sources目录下创建自己的模块代码,如:
$HOME/.ejabberd-modules/sources/mod_mysupermodule/
运行
ejabberdctl module_check mod_mysupermodule
可检查该目录是否符合模块规定(policy), 如:
C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_check mod_mysupermodule
Error: [{missing,"COPYING"},
{missing,"README.txt"},
{missing,"src (Erlang) or lib (Elixir) sources directory"},
{missing_meta,url},
{missing_meta,home},
{missing_meta,summary},
{missing_meta,author}]
需要COPYING和README.txt文件,src目录。
还有 mod_mysupermodule.spec 文件,仿照其他模块的例子写就行了,例如:
url: "http://localhost"
summary: "My super m"
home: "http://localhost"
author: "Jin Qing"
可以查看到可用模块:
C:\Program Files\ejabberd-16.08\bin>ejabberdctl modules_available
...
mod_mysupermodule My super m
...
即使没有任何源文件,也可以module_install.
C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_install mod_mysupermodule
ok
更改 src\mod_mysupermodule.erl 后,无法再次安装:
C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_install mod_mysupermodule
Error: conflict
好像可以用 module_upgrade:
C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_upgrade mod_mysupermodule
src/mod_mysupermodule.erl:4: Warning: undefined callback function depends/2 (beh
aviour 'gen_mod')
src/mod_mysupermodule.erl:4: Warning: undefined callback function mod_opt_type/1
(behaviour 'gen_mod')
ok
C:\Program Files\ejabberd-16.08\bin>
按文档说明,需要手工修改
C:\Users\jinqing\AppData\Roaming\ejabberd\conf\ejabberd.yml
实际测试配置不需要手工修改,只需要创建
C:\.ejabberd-modules\sources\mod_mysupermodule\conf\mod_mysupermodule.yml
modules:
mod_mysupermodule: {}
按文件说明,需要手工复制编译生成的
C:\.ejabberd-modules\mod_mysupermodule
到
C:\Program Files\ejabberd-16.08\lib\mod_mysupermodule
查看代码,应该是会自动添加代码目录
C:\.ejabberd-modules\mod_mysupermodule\ebin
实际发现
2016-08-24 16:27:54.016 [critical] <0.550.0>@gen_mod:start_module:162 Problem starting the module mod_mysupermodule for host <<"zt-2203857">>
options: []
error: undef
[{mod_mysupermodule,start,[<<"zt-2203857">>,[]],[]},
{gen_mod,start_module,3,[{file,"src/gen_mod.erl"},{line,154}]},
{lists,foreach,2,[{file,"lists.erl"},{line,1337}]},
{ejabberd_app,start,2,[{file,"src/ejabberd_app.erl"},{line,76}]},
{application_master,start_it_old,4,
[{file,"application_master.erl"},{line,273}]}]
2016-08-24 16:27:54.016 [critical] <0.550.0>@gen_mod:maybe_halt_ejabberd:170 ejabberd initialization was aborted because a module start failed.
是Windows下还有问题。
需如下更改ext_mod.erl:
modules_dir() ->
DefaultDir = filename:join(getenv("HOME"), ".ejabberd-modules"),
- getenv("CONTRIB_MODULES_PATH", DefaultDir).
+ getenv("CONTRIB_MODULES_PATH", filename:absname(DefaultDir)).
不然add_patha/1会失败:
code:add_patha("/.ejabberd-modules/mod_mysupermodule/ebin").
然后重启(可能不需要):
C:\Program Files\ejabberd-16.08\bin>ejabberdctl restart