Reduzierter Aufwand für Golang-Dienstprogramme

    Ziel der Arbeit ist es, den Aufwand für das Speichern einer großen Anzahl von in Golang geschriebenen Dienstprogrammen zu verringern.

    Eine der Nebenwirkungen der statischen Kompilierung von Golang ist der relativ hohe Aufwand für das Speichern der Laufzeit und aller in den einzelnen ausführbaren Dateien verwendeten Bibliotheken. Ein kleines Dienstprogramm, das nur das ausführt, worauf es über das Netzwerk zugreift, und das die empfangenen einfachen Befehle ausführt - wiegt 5,5 MB.
    Wenn es nur einen solchen Nutzen gibt - unter modernen Bedingungen ist dies immer noch nicht beängstigend. Wenn sich Versorgungsunternehmen ansammeln und es bereits mehrere zehn oder hunderte von ihnen gibt - rein menschlich wird es schade für die Hunderte von Megabyte, die "aus dem Nichts" auslaufen.

    Um dieses Problem zu lösen, habe ich eine Multiex- Bibliothek geschrieben, die ich mit der Community teile. Mit seiner Hilfe können Sie mehrere Programme mit minimalen Änderungen im Programmcode und ohne Änderung des externen Verhaltens zu einer ausführbaren Datei zusammenfassen. Die Idee stammt von busybox - alle Programme werden in eine einzige Datei kompiliert und der ausführbare Code wird beim Start basierend auf dem Namen der zu startenden Datei ausgewählt.



    Um Programme zu verbinden, müssen Sie die Registrar-Funktion aufrufen, zum Beispiel so:
    func f1(){
      if os.Args[1] == "asdf" {
        println("ok")
      }
    }
    multiex.Register(multiex.ExecutorDescribe{Name: "test", Function: f1})
    


    Der Programmname wird in die Struktur übernommen - wird die ausführbare Datei mit dem Namenstest aufgerufen, so wird die Funktion f1 aufgerufen. Als nächstes folgt der normale Betrieb der Funktion ohne Änderungen, einschließlich Es ist möglich, die übergebenen Befehlszeilenargumente auf die übliche Weise zu analysieren.
    ./test asdf

    ./test kann der Name einer ausführbaren Datei, eines festen Links oder eines symbolischen Links sein.

    Außerdem können Sie die Funktion f1 aufrufen, wenn der erste Parameter der ausführbaren Datei --multiex-command = test ist. In diesem Fall wird der Parameter --multiex-command = test gelöscht und die Funktion f1 kann ihre Argumente wie gewohnt analysieren.
    ./any --multiex-command = test asdf

    Die Bibliothek hat das gleichnamige Programm mit dem Namen multiex bereits implementiert und kann derzeit:
    1. Zeigen Sie eine kurze Hilfe an, um welche Art von Datei es sich handelt und welche Programme darin enthalten sind - wenn die Datei mit einem unerwarteten Namen aufgerufen wird.
    2. Erstellen Sie symbolische Links zu allen Programmen, die in der ausführbaren Datei enthalten sind. Links werden in demselben Ordner erstellt, in dem sich die ausführbare Datei befindet.
    ./any --multiex-command = multiex install

    Hiermit wird keine Verknüpfung zu multiex selbst erstellt.

    In github.com/rekby/multiex-example zeigt die Verbindung ein Beispiel von Programmen:
    1. Registrierung von Funktionen direkt im kompilierten Hauptmodul. Bei dieser Methode kennt das Hauptassemblierungsmodul die einzubeziehenden Funktionen. Wenn Sie eine neue Funktion hinzufügen, müssen Sie deren Aufzählung zur Registrierungsliste hinzufügen. In diesem Fall ist es nicht erforderlich, den enthaltenen Programmen selbst eine Abhängigkeit von multiex hinzuzufügen - es reicht aus, die exportierte Main-Funktion zu haben.
    2. Plug-Ins werden in das Assembly-Modul importiert und jedes Modul registriert seine Funktionen während des Initialisierungsprozesses. Hier kennt das Assembly-Modul nur die Liste der enthaltenen Module und nicht jede Funktion. Jedes Modul bestimmt selbst, welche Funktionen es exportiert. Um eine neue Funktion zu exportieren, reicht es aus, nur das Modul mit dieser Funktion zu korrigieren.
    3. Natürlich können beide Methoden kombiniert werden (im Beispiel wird nur die kombinierte Version gezeigt).

    Darüber hinaus kann jedes Programm seine Unabhängigkeit bewahren und bei Bedarf getrennt von den anderen in eine eigene Datei kompiliert und wie gewohnt ausgeführt werden. Dies erfolgt durch Hinzufügen des Hauptunterordners zum Quellcode des Programms. Darüber hinaus kann diese Datei für alle Projekte gleich sein und bei Bedarf einfach und ohne Änderungen kopiert werden.

    github.com/rekby/multiex

    Jetzt auch beliebt: