78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
package plugin
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"github.com/gogf/gf/v2/os/glog"
|
|
)
|
|
|
|
var (
|
|
plugins = make(map[string]*PluginEntry)
|
|
mu sync.RWMutex
|
|
app *App
|
|
)
|
|
|
|
// PluginEntry 插件注册条目。
|
|
type PluginEntry struct {
|
|
Plugin Plugin
|
|
Info PluginInfo
|
|
Status PluginStatus
|
|
}
|
|
|
|
// PluginStatus 插件状态类型。
|
|
type PluginStatus string
|
|
|
|
const (
|
|
StatusRegistered PluginStatus = "registered" // 已注册(代码加载但未安装)
|
|
StatusInstalled PluginStatus = "installed" // 已安装(数据库初始化完成)
|
|
StatusEnabled PluginStatus = "enabled" // 已启用(正在运行)
|
|
StatusDisabled PluginStatus = "disabled" // 已禁用(已安装但未运行)
|
|
StatusError PluginStatus = "error" // 异常
|
|
)
|
|
|
|
// Register 注册插件(在插件的 init() 函数中调用)。
|
|
func Register(p Plugin) {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
|
|
info := p.Info()
|
|
if info.Name == "" {
|
|
panic("plugin: name is required")
|
|
}
|
|
if _, exists := plugins[info.Name]; exists {
|
|
panic("plugin: duplicate registration: " + info.Name)
|
|
}
|
|
|
|
plugins[info.Name] = &PluginEntry{
|
|
Plugin: p,
|
|
Info: info,
|
|
Status: StatusRegistered,
|
|
}
|
|
|
|
glog.Infof(context.Background(), "plugin registered: %s v%s", info.Name, info.Version)
|
|
}
|
|
|
|
// GetPlugin 获取已注册的插件。
|
|
func GetPlugin(name string) *PluginEntry {
|
|
mu.RLock()
|
|
defer mu.RUnlock()
|
|
return plugins[name]
|
|
}
|
|
|
|
// AllPlugins 获取所有已注册插件。
|
|
func AllPlugins() []*PluginEntry {
|
|
mu.RLock()
|
|
defer mu.RUnlock()
|
|
result := make([]*PluginEntry, 0, len(plugins))
|
|
for _, entry := range plugins {
|
|
result = append(result, entry)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// GetApp 获取框架服务实例。
|
|
func GetApp() *App {
|
|
return app
|
|
}
|