金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
ejabberd模块开发

(金庆的专栏 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
posted on 2016-08-25 12:17 金庆 阅读(488) 评论(0)  编辑 收藏 引用 所属分类: 7. Erlang

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理