2017-05-29 8 views
1

Ich möchte hinzufügen, dynamisch einen HTTP-Router erstellen benutzerdefinierte plugins/middleware verwenden, zur Zeit, ich config.yml zum Beispiel bin mit:Wie dynamisch Importe

plugins: 
    - waf 
    - jwt 
    - cors 

Nach dem yml Datei Parsen erstelle ich die Routen wie folgt aus:

route := violetear.New() 
chain := middleware.New() 
for _, plugin := range Plugins { 
    chain := chain.Append(plugin)  
} 
router.Handle("/test", chain.Then(myHandler)) 
log.Fatal(http.ListenAndServe(":8080", router)) 

Damit dies funktioniert, würde ich alle Plugins in dem Import-Abschnitt enthalten hat, so etwas wie:

import (
    "net/http" 

    "github.com/nbari/violetear" 
    "github.com/nbari/violetear/midleware" 

    // How to deal with this 
    "github.com/example/waf" 
    "github.com/example/jwt" 
    "github.com/example/cors" 
) 

ich müsste das aktuelle Config-Format ändern wahrscheinlich etwas mehr sinnvoll/generisch sein etwas wie:

plugins: 
    - [github.com/foo, foo] 
    - [github.com/bar, bar] 

Aber außer dass das, was der beste Ansatz sein könnte „dynamisch“, um die Importe zu erstellen oder zu erzeugen, der Code, den man später kompilieren könnte?

Irgendwelche Ideen?

Antwort

1

Go ist eine statisch verknüpfte Sprache. Das bedeutet, wenn ein Paket zum Kompilierungszeitpunkt nicht referenziert wird (aus Ihren .go Quelldateien), wird dieses Paket nicht mit der ausführbaren Binärdatei verknüpft/kompiliert, was bedeutet, dass es zur Laufzeit nicht verfügbar ist.

Am einfachsten ist es also, nur Importe zu verwenden.

Wenn Sie wirklich dynamische Konfiguration möchten, plugins in Go 1.8 eingeführt möglicherweise eine Option für Sie sein, aber die Verwendung von Plugins kompliziert Dinge und ich würde das nur als letztes Mittel verwenden. Beachten Sie auch, dass Plugins derzeit nur auf Linux funktionieren.

Verwandte Fragen:

Dynamic loading in Golang?

Go Plugin variable initialization

go 1.8 plugin use custom interface

+0

Hallo, ich habe darüber nachgedacht, mit 'generate' gehen und eine' Makefile' verwenden zu erzeugen und später bauen vielleicht könnte arbeitest du irgendwelche Gedanken? – nbari

+0

@nbari Ja, wenn Sie mit der Vorverarbeitung in Ordnung sind, können Sie generieren, kann nützlich sein, aber es wird nicht dynamisch sein, wie Sie im ersten Satz Ihrer Frage angefordert. – icza