Swift插件架构

Ant*_*sen 8 plugins swift

我正在寻找一种在Swift中的插件架构中实现的方法.

用例

一个应用程序,fx.CLI,有一个文件夹,可以在其中放置插件,并在应用程序启动时加载.

要求

  • 能够定义插件必须或可以遵守的协议或协议集.
  • Pure Swift.
  • 反思给定插件实现的协议.
  • 应用程序启动时动态加载.
  • 与委托模式沟通.
  • 插件开发人员应该能够导入协议,实现它们,编译并将二进制文件放在插件文件夹中.

我试过的

我曾经Process开始使用可执行文件,我也可以添加参数.但这不符合我的要求.

我发现了这篇文章如何完成,但这需要使用NSBundle和Objective-C这样做也没有用.

我真的不确定如何解决这个问题.任何有关正确方向的帮助或指示都将不胜感激.

Con*_*has 1

Swift 目前没有稳定的 ABI,因此您还不能依赖本机接口。(预计 Swift 4 将解决这个问题。)

我现在可以想到两个选项,但都依赖于在主机和插件之间定义某种通信协议。如果您无法使用 Objective-C,您还必须自己实现您的需求(功能内省等)。

  1. 低于 C ABI。对于您需要的每个函数,请使用注释在 Swift 中的被调用方实现它@convention(c),并在标头中的调用方声明它以进行外部链接。您无法两次实现一个函数,因此您应该定义一个基于回调的 API,插件可以将自身注册到其中。

  2. 定义一个(例如,基于套接字的)通信协议并编写要在每个插件中导入的 Swift 源文件。使插件可执行,在主机应用程序启动时启动通信。

我个人更喜欢选项 2,因为它不需要与链接器等混合,并且您还可以获得定义 Swift 类型和函数以供插件使用的额外好处。此外,由于插件是分叉子插件,因此它可能会崩溃而不影响主机。