mengstack-api/internal/kernel/plugin/registry.go
MengStack Dev 9bb2c447ec
Some checks failed
CI / Build & Test (push) Failing after 40s
feat: 插件接口预留 — Plugin 接口 + Registry + 示例插件
- kernel/plugin: 定义 Plugin 接口(Metadata/FxOption/SetupRoutes/Init)
- kernel/plugin: 全局 Registry(Register/All/InitAll/Reset)
- modules/example: 完整 4 层示例插件,实现 Plugin 接口
- config: 新增 PluginConfig(enabled 列表)
- app.go: 集成插件系统 — fx.Invoke 注册 + plugin.All() 路由 + InitAll 生命周期
2026-10-03 02:07:46 +08:00

53 lines
987 B
Go

package plugin
import (
"fmt"
"sync"
"go.uber.org/zap"
)
var (
registry []Plugin
mu sync.RWMutex
)
// Register adds a plugin to the global registry.
// Typically called in init() or during application bootstrap.
func Register(p Plugin) {
mu.Lock()
defer mu.Unlock()
registry = append(registry, p)
}
// All returns a copy of all registered plugins.
func All() []Plugin {
mu.RLock()
defer mu.RUnlock()
out := make([]Plugin, len(registry))
copy(out, registry)
return out
}
// InitAll initializes all registered plugins in order.
func InitAll(log *zap.Logger) error {
for _, p := range All() {
meta := p.Metadata()
log.Info("initializing plugin",
zap.String("name", meta.Name),
zap.String("version", meta.Version),
)
if err := p.Init(); err != nil {
return fmt.Errorf("plugin %s init failed: %w", meta.Name, err)
}
}
return nil
}
// Reset clears the registry. Used in tests only.
func Reset() {
mu.Lock()
defer mu.Unlock()
registry = nil
}