Some checks failed
CI / Build & Test (push) Failing after 40s
- 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 生命周期
53 lines
987 B
Go
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
|
|
}
|