2016-11-19 71 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,因爲它不要求有接頭和這樣的交融,你會得到斯威夫特定義類型和功能插件的使用額外的獎勵。另外,由於該插件是一個分叉的子項,因此它可能會崩潰而不會影響主機。