2016-11-19 69 views
8

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

使用案例

的应用,FX。一个CLI,有一个文件夹,它可以在其中执行插件的位置,并在应用程序启动时加载。

要求

  • 能够定义一个协议或一组插件 葡萄汁或能坚持协议。
  • Pure Swift。
  • 反思给定插件实现的协议。
  • 应用程序启动时动态加载。
  • 与代表模式进行通信。
  • 插件开发人员应该能够导入协议,实现它们,编译并将二进制文件放置在插件文件夹中。

我已经试过

我用Process启动一个可执行文件,我还可以添加参数。 但这并不符合我的要求。

我碰到过这个post它如何完成,但这需要使用NSBundle和Objective-C,所以这也不行。

我真的不知道该怎么做。任何帮助或指针在正确的方向将不胜感激。

+0

你打算在Linux上进行这项工作吗?关于App Store呢? – Kametrixom

+0

@Kametrixom Linux是一个目标。 App Store不是必需品。 –

+0

嗨。你能够在Swift中实现这种插件架构吗?这就是我现在需要处理的事情。你有什么建议给我? – Subi

回答

1

Swift目前没有稳定的ABI,所以你不能依赖本地接口。 (预计这将由Swift 4解决。)

我现在可以考虑两种选择,但都依赖于定义主机和插件之间的某种通信协议。如果你不能使用Objective-C,你还必须自己实现自己的需求(自省功能等)。

  1. 降低到C ABI。对于您需要的每个功能,请使用@convention(c)批注在Swift的被叫侧实施它,并在呼叫方的头部声明外部链接。你将不能实现一个函数两次,所以你应该定义一个插件自己注册的基于回调的API。

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

我个人比较喜欢选项2,因为它不要求有接头和这样的交融,你会得到斯威夫特定义类型和功能插件的使用额外的奖励。另外,由于该插件是一个分叉的子项,因此它可能会崩溃而不会影响主机。