Go的"插件系统"

Alb*_*dez 7 plugins design-patterns go

我正在寻找相当于Go语言的Architect.

使用Architect,模块可以显示"插件".插件可以指定依赖项,并导出API以允许与其他插件进行交互.要启动应用程序实例,请指定插件列表.解析依赖关系,并按顺序加载(实例化)插件.

由于每个应用程序都创建了每个插件的单个实例,因此可以在同一进程中启动多个应用程序而不会发生冲突.

编辑:我不需要动态加载其他模块.

laz*_*zy1 3

我没有一个包可以做到这一点,但对如何做到这一点有一些想法 - 希望它会有所帮助。

  • 为每个插件使用构建标签。
  • 让每个插件(文件)在特殊注释/变量中指定其依赖项
  • 运行生成初始化顺序的预构建步骤(拓扑排序、循环失败)。输出是一个 go 文件,它是插件系统初始化时调用的函数。
  • RegistryPlugin接口,可能是这样的:

    type Registry {
        // Register registers a plugin under name
        Register(name string, plugin *Plugin) error
        // Get plugin by name
        Get(name string) (*Plugin, error)
    }
    
    // Global Registry
    var GlobalRegistry Registry
    
    type Plugin interface {
        // Init is called upon plugin initialization. Will be in dependency order
        Init(reg Registry) error
        // Execute plugin command
        Exec(name string, args... interface{}) (interface{}, error)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 跑步go build -tags plugin1,plugin2