"插件系统"为了Go

时间:2014-07-19 11:27:36

标签: design-patterns plugins go

我正在寻找Go语言的等效Architect

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

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

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

1 个答案:

答案 0 :(得分:2)

我不是一个能做到这一点的软件包,但对如何做到这一点有一些想法 - 希望它能提供帮助。

  • 为每个插件使用build tag
  • 让每个插件(文件)在特殊注释/变量中指定其依赖项
  • 运行预构建步骤,生成初始化顺序(toplogical sort,循环失败)。输出是一个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)
    }
    
  • 运行go build -tags plugin1,plugin2