【问题标题】:Swift plug-in architectureSwift 插件架构
【发布时间】:2016-11-19 14:06:43
【问题描述】:

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

用例

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

要求

  • 能够定义一个协议或一组协议插件 必须或可以遵守。
  • 纯斯威夫特。
  • 自省给定插件实现了哪些协议。
  • 在应用程序启动时动态加载。
  • 与委托模式通信。
  • 插件开发人员应该能够导入协议、实现它们、编译二进制文件并将其放置在插件文件夹中。

我的尝试

我使用Process 来启动一个可执行文件,我还可以在其中添加参数。 但这并不能满足我的要求。

我遇到了这个 post 的实现方法,但这需要使用 NSBundle 和 Objective-C,所以这也不好。

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

【问题讨论】:

  • 您打算在 Linux 上进行这项工作吗? App Store 呢?
  • @Kametrixom Linux 是一个目标。 App Store 不是必需的。
  • 嗨。你能在 Swift 中实现这个插件架构吗?这就是我现在需要做的事情。你对我有什么建议吗?

标签: swift plugins


【解决方案1】:

Swift 目前还没有稳定的 ABI,所以你还不能依赖原生接口。 (这预计将在 Swift 4 中解决。)

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多