插件相关

PluginConfig

  1. //PluginConfig 插件配置定义
  2. //PluginConfig 插件配置定义
  3. type PluginConfig struct {
  4. Name string //插件名称
  5. Type byte //类型
  6. Config interface{} //插件配置
  7. UIDir string //界面目录
  8. Version string //插件版本
  9. Dir string //插件代码路径
  10. Run func() //插件启动函数
  11. HotConfig map[string]func(interface{}) //热修改配置
  12. }

该结构体用于作为插件启动时传入引擎的参数,见InstallPlugin函数。

  • Name 是插件在安装时的唯一标识,建议使用首字母大写的英文单词或者缩写表示。
  • Type 插件类型,见插件类型条目
  • Config 这个是插件使用的配置信息,是一个自定义结构体对象,插件配置读取后,将会通过反序列化构造出自定义的结构体对象。
  • UIDir 指示插件的界面资源的绝对路径,默认值是插件目录下的ui/dist,如果该插件没有UI界面,则不需要设置该值。
  • Dir 是指插件安装后的绝对路径,由引擎自动获取,无需配置
  • Run 是一个函数,在插件配置解析完成后,会调用该函数,也可以不设置。如果在配置文件中找不到对应的插件配置,则不会调用该函数。
  • HotConfig 是一个map,键为需要热更新的配置属性,值为一个函数,用于接收新的配置值。

InstallPlugin

  1. // InstallPlugin 安装插件
  2. func InstallPlugin(opt *PluginConfig) {
  3. log.Printf("install plugin %s version: %s", opt.Name, opt.Version)
  4. Plugins[opt.Name] = opt
  5. }

该函数用于安装插件,如果你写的插件不需要被罗列在插件列表中,也没有配置文件,那么就不需要调用该函数。

示例;

  1. func init() {
  2. InstallPlugin(&PluginConfig{
  3. Name: "LogRotate",
  4. Type: PLUGIN_HOOK,
  5. Config: config,
  6. Run: run,
  7. })
  8. }

一般我们会在插件的init函数中调用该函数,以在第一时间启动插件。在调用过引擎的Run函数后,再安装插件就会错过插件启动的时机。

插件类型

  1. const (
  2. PLUGIN_NONE = 0 //独立插件
  3. PLUGIN_SUBSCRIBER = 1 //订阅者插件
  4. PLUGIN_PUBLISHER = 1 << 1 //发布者插件
  5. PLUGIN_HOOK = 1 << 2 //钩子插件
  6. )

插件可以同时具备多项功能,因此可以使用或(|)运算符连接多个类型例如 PLUGIN_PUBLISHER|PLUGIN_SUBSCRIBER

Plugins

全局插件集合

  1. // Plugins 所有的插件配置
  2. var Plugins = make(map[string]*PluginConfig)

如果需要界面上显示插件配置的信息,可以直接将该集合序列化后传输到浏览器中。