# builder 识别插件的方式 > 以 Go 语言为例 目前的 main.go 模板如下: - 用于填充的数据 ```go= type fnInfo struct { // 用户代码的目录环境 Source string // 用户函数的名称 Target string // 用户包名称 Package string // 插件信息 Plugins []Plugin } type Plugin struct { // 引入的插件包别名 AliasName string // 插件的引入路劲 Path string // 获取插件名称的方法 GetNameFunc string // 插件初始化的方法 NewFunc string } ``` - 模板 ```go= package main import ( "context" "reflect" "k8s.io/klog/v2" "github.com/tpiperatgod/offf-go/framework" "github.com/tpiperatgod/offf-go/plugin" userfunction "{{.Package}}" {{- range $Plugin := .Plugins }} {{ $Plugin.AliasName }} "{{ $Plugin.Path -}}" {{- end }} ) func main() { ctx := context.Background() fwk, err := framework.NewFramework() if err != nil { klog.Exit(err) } fwk.RegisterPlugins(getLocalPlugins()) if err := fwk.Register(ctx, userfunction.{{.Target}}); err != nil { klog.Exit(err) } if err := fwk.Start(ctx); err != nil { klog.Exit(err) } } func getLocalPlugins() map[string]plugin.Plugin { nilPlugins := map[string]plugin.Plugin{} localPlugins := map[string]plugin.Plugin{ {{- range $Plugin := .Plugins }} {{ $Plugin.GetNameFunc }}: {{ $Plugin.NewFunc }}, {{- end }} } if reflect.DeepEqual(localPlugins, nilPlugins) { return nil } else { return localPlugins } } ``` - 渲染后的样例 ```go= package main import ( "context" "reflect" "k8s.io/klog/v2" "github.com/tpiperatgod/offf-go/framework" "github.com/tpiperatgod/offf-go/plugin" userfunction "example.com/hello" pluginCustom "example.com/hello/plugins/plugin-custom" ) func main() { ctx := context.Background() fwk, err := framework.NewFramework() if err != nil { klog.Exit(err) } fwk.RegisterPlugins(getLocalPlugins()) if err := fwk.Register(ctx, userfunction.HelloWorld); err != nil { klog.Exit(err) } if err := fwk.Start(ctx); err != nil { klog.Exit(err) } } func getLocalPlugins() map[string]plugin.Plugin { nilPlugins := map[string]plugin.Plugin{} localPlugins := map[string]plugin.Plugin{ pluginCustom.Name: pluginCustom.New(), } if reflect.DeepEqual(localPlugins, nilPlugins) { return nil } else { return localPlugins } } ``` ## 配置文件 用户可以提供如下配置文件: ```yaml= plugins: - name: plugin-a path: "plugins/plugin-a" aliasName: "pluginA" - name: plugin-b path: "plugins/plugin-b" aliasName: "pluginB" ``` ## 扫描目录(当前采用) 构建过程中会扫描用户代码目录下的 `plugins` 目录 找出该目录下以 `plugin-` 开头的目录,以目录名称作为引入包的名称 ## 对比 | 方案 | 优点 | 缺点 | | -------- | -------- | -------- | | 配置文件 | 定义明确 | 增加用户工作量 | | 扫描目录 | 定义明确 | 增加用户工作量 |