Ich bin auf der Suche nach einer Möglichkeit, um Plug-in-Architektur in Swift zu implementieren.
Anwendungsfall
Eine Anwendung, fx. eine CLI, hat einen Ordner, von wo es ausgeführt wird, wo Plug-Ins platziert werden können und wird geladen, wenn die Anwendung gestartet wird.
Anforderungen
Was ich versucht habe
Ich habe Process
verwendet, um eine ausführbare Datei zu starten, in der ich auch Argumente hinzufügen kann.
Aber das entspricht meinen Anforderungen nicht.
Ich stieß auf diesen Beitrag , wie es gemacht werden könnte, aber das erfordert die Verwendung von NSBundle
und Objective-C, also ist das auch nicht gut.
Ich bin mir nicht sicher, wie ich das anstellen soll. Jede Hilfe oder Hinweise in die richtige Richtung würden sehr geschätzt werden.
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 kann mir jetzt zwei Möglichkeiten vorstellen, aber beide verlassen sich auf die Definition eines Kommunikationsprotokolls zwischen Host und Plug-in. Sie müssen auch Ihre Anforderungen implementieren (Introspektion von Features usw.), wenn Sie Objective-C nicht verwenden können.
Verringern Sie den C ABI. Implementieren Sie es für jede Funktion, die Sie benötigen, auf der aufgerufenen Seite in Swift mit der Annotation @convention(c)
und deklarieren Sie sie auf der Seite des Aufrufers 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.
Definieren Sie ein (z. B. Socket-basiertes) Kommunikationsprotokoll und schreiben Sie die zu importierenden Swift-Quelldateien in jedes Plug-in. Machen Sie die Plugins ausführbar, die nach dem Start der Host-Anwendung die Kommunikation starten.
Ich persönlich bevorzuge Option 2, weil es keine Vermischung mit Linkern und dergleichen erfordert, und Sie erhalten den zusätzlichen Bonus, Swift-Typen und -Funktionen für die Verwendung des Plug-Ins zu definieren. Da das Plug-In ein gegabeltes Kind ist, kann es abstürzen, ohne den Host zu beeinflussen.