Schnelle Plug-in-Architektur

8

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

  • In der Lage zu sein, ein Protokoll oder eine Reihe von Protokollen für diese Plug-ins zu definieren muss oder kann sich daran halten.
  • Pure Swift.
  • Überprüfen Sie, welche Protokolle ein bestimmtes Plug-in implementiert.
  • Wird beim Start der Anwendung dynamisch geladen.
  • 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 stellen.

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.

    
Anton Gregersen 19.11.2016, 14:06
quelle

1 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 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.

  1. 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.

  2. 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.

    
Randy Marsh 22.11.2016 20:52
quelle

Tags und Links