package main import ( "context" "fmt" "os" "path/filepath" "github.com/darkit/goproxy/examples/plugin" ) func main() { // 创建上下文 ctx := context.Background() // 获取插件目录 pluginsDir := filepath.Join("..", "plugins") if _, err := os.Stat(pluginsDir); os.IsNotExist(err) { if err := os.MkdirAll(pluginsDir, 0o755); err != nil { fmt.Printf("创建插件目录失败: %v\n", err) os.Exit(1) } } // 创建插件管理器 pm := plugin.NewPluginManager(pluginsDir) // 检查是否支持动态加载插件 if pm.IsDynamicLoadingSupported() { fmt.Println("当前系统支持动态加载插件") } else { fmt.Println("当前系统不支持动态加载插件,将使用静态插件") // 在不支持动态加载的平台上注册内置插件 // 这里需要导入并注册所有内置插件 // 例如:pm.RegisterPlugin(logger.Plugin) } // 加载插件 if err := pm.LoadPlugins(); err != nil { fmt.Printf("加载插件失败: %v\n", err) os.Exit(1) } // 初始化所有插件 if err := pm.InitPlugins(ctx); err != nil { fmt.Printf("初始化插件失败: %v\n", err) os.Exit(1) } // 启动所有插件 if err := pm.StartPlugins(ctx); err != nil { fmt.Printf("启动插件失败: %v\n", err) os.Exit(1) } // 打印所有插件信息 fmt.Println("\n=== 所有已加载的插件 ===") for _, info := range pm.GetPluginInfos() { fmt.Printf("插件名称: %s\n", info.Name) fmt.Printf("版本: %s\n", info.Version) fmt.Printf("描述: %s\n", info.Description) fmt.Printf("作者: %s\n", info.Author) fmt.Printf("类型: %s\n", info.Type) fmt.Printf("启用状态: %v\n", info.Enabled) fmt.Println("---") } // 按类型获取插件 fmt.Println("\n=== 按类型获取插件 ===") // 获取所有存储类型插件 storagePlugins := pm.GetPluginsByType(plugin.PluginTypeStorage) fmt.Printf("存储插件数量: %d\n", len(storagePlugins)) for _, p := range storagePlugins { fmt.Printf("存储插件: %s (版本: %s)\n", p.Name(), p.Version()) } // 获取所有工具类型插件 utilsPlugins := pm.GetPluginsByType(plugin.PluginTypeUtils) fmt.Printf("工具插件数量: %d\n", len(utilsPlugins)) for _, p := range utilsPlugins { fmt.Printf("工具插件: %s (版本: %s)\n", p.Name(), p.Version()) } // 在生命周期的不同阶段按类型初始化和启动插件 fmt.Println("\n=== 按类型初始化和启动插件 ===") // 例如,在应用程序启动阶段只初始化工具插件 if err := pm.InitPluginsByType(ctx, plugin.PluginTypeUtils); err != nil { fmt.Printf("初始化工具插件失败: %v\n", err) } else { fmt.Println("工具插件初始化成功") } // 在需要存储功能时初始化存储插件 if err := pm.InitPluginsByType(ctx, plugin.PluginTypeStorage); err != nil { fmt.Printf("初始化存储插件失败: %v\n", err) } else { fmt.Println("存储插件初始化成功") } // 使用特定类型的插件示例 fmt.Println("\n=== 使用特定类型的插件示例 ===") fmt.Println("注意:这部分代码在真实环境中需要使用类型断言或接口来处理") fmt.Println("在实际应用中,应该为每种类型的插件定义专门的接口") // 按类型停止插件 fmt.Println("\n=== 按类型停止插件 ===") // 首先停止存储插件 if err := pm.StopPluginsByType(ctx, plugin.PluginTypeStorage); err != nil { fmt.Printf("停止存储插件失败: %v\n", err) } else { fmt.Println("存储插件已停止") } // 然后停止工具插件 if err := pm.StopPluginsByType(ctx, plugin.PluginTypeUtils); err != nil { fmt.Printf("停止工具插件失败: %v\n", err) } else { fmt.Println("工具插件已停止") } // 确保所有剩余插件都被停止 if err := pm.StopPlugins(ctx); err != nil { fmt.Printf("停止剩余插件失败: %v\n", err) os.Exit(1) } fmt.Println("\n所有插件已停止") }