2016-11-19 7 views
8

Ich bin auf der Suche nach einer Möglichkeit zur Implementierung in Plug-in-Architektur in Swift.Swift Plug-in-Architektur

Use Case

Eine Anwendung, fx. eine CLI, hat einen Ordner, von wo es ausgeführt wird, wo Plugins platziert werden können und wird geladen, wenn die Anwendung startet.

Anforderungen

  • Die Möglichkeit, ein Protokoll oder eine Reihe von Protokollen zu definieren, die muss Plug-In oder halten.
  • Pure Swift.
  • Introspect welche Protokolle ein bestimmtes Plug-in implementiert.
  • Wird dynamisch geladen, wenn die Anwendung gestartet wird.
  • Kommunizieren Sie mit dem Delegatenmuster.
  • Plug-in-Entwickler sollten in der Lage sein, Protokolle zu importieren, zu implementieren, zu kompilieren und die Binärdatei in den Plug-In-Ordner zu platzieren.

Was ich versucht habe

Ich habe Process verwendet, um eine ausführbare Datei zu starten, wo ich auch Argumente hinzufügen. Aber das erfüllt meine Anforderungen nicht.

Ich kam in dieser post, wie es getan werden könnte, aber das erfordert die Verwendung von NSBundle und Objective-C, so dass entweder nicht gut ist.

Ich bin nicht wirklich sicher, wie das geht. Jede Hilfe oder Hinweise in die richtige Richtung würden sehr geschätzt werden.

+0

Planen Sie, dass dies unter Linux funktioniert? Was ist mit dem App Store? – Kametrixom

+0

@Kametrixom Linux ist ein Ziel. App Store ist keine Voraussetzung. –

+0

Hallo. Können Sie diese Plug-in-Architektur in Swift erreichen? Daran muss ich gerade arbeiten. Irgendwelche Vorschläge hast du für mich? – Subi

Antwort

1

Swift hat derzeit keinen stabilen ABI, so dass Sie sich noch nicht auf native Schnittstellen verlassen können. (Dies wird voraussichtlich von Swift 4 gelöst werden.)

Ich denke für jetzt zwei Optionen, aber beide verlassen sich auf die Definition einer Art von Kommunikationsprotokoll zwischen Host und Plug-in. Sie müssen auch Ihre Anforderungen selbst implementieren (Introspektion von Features usw.), wenn Sie Objective-C nicht verwenden können.

  1. Unter dem C ABI. Für jede Funktion, die Sie benötigen, implementieren Sie es auf der angerufenen Seite in Swift mit der @convention(c) Annotation und erklären Sie es auf der anrufenden Seite in einer Kopfzeile für die externe Verknüpfung. Sie können eine Funktion nicht zweimal implementieren, daher sollten Sie eine Callback-basierte API definieren, in der sich Plug-Ins registrieren.

  2. Definieren Sie ein (z. B. Socket-basiertes) Kommunikationsprotokoll und schreiben Sie die Swift-Quelldateien, die in jedes Plug-In importiert werden sollen. Machen Sie die Plug-ins ausführbar, die nach dem Start der Host-Anwendung die Kommunikation starten.

Ich persönlich bevorzuge die Option 2, weil es nicht Vermengung erfordert mit Linker und so und Sie erhalten den zusätzlichen Bonus von Swift Typen und Funktionen für die Plug-In-Anwendung zu definieren. Da das Plug-in ein gegabeltes Kind ist, kann es auch abstürzen, ohne den Host zu beeinflussen.