paint-brush
So betten Sie statische Ressourcen in ein Go-Projekt einvon@kibizovd
837 Lesungen
837 Lesungen

So betten Sie statische Ressourcen in ein Go-Projekt ein

von David Kibizov3m2023/11/28
Read on Terminal Reader

Zu lang; Lesen

Die Verwendung einer eigenständigen Anwendung vereinfacht die Bereitstellung und Verteilung, da es sich lediglich um eine ausführbare Binärdatei handelt. Für die Einbettung von Ressourcen in eine Go-Anwendung stehen Rice, Statik und Bindata zur Verfügung. Lassen Sie uns eine index.html-Vorlage erstellen und sie mit einer statischen Ressource testen, um den Go-Code zu testen.
featured image - So betten Sie statische Ressourcen in ein Go-Projekt ein
David Kibizov HackerNoon profile picture

Ich wollte eine kleine eigenständige Webanwendung in Go erstellen, das Gegenteil einer regulären Webanwendung, bei der Ressourcen separat über einen CDN- oder HTTP-Server wie Nginx bereitgestellt werden.


Wenn die Leistung jedoch keine entscheidende Rolle spielt oder die Anwendung für einen geringen Datenverkehr ausgelegt ist, vereinfacht die Verwendung einer eigenständigen Anwendung die Bereitstellung und Verteilung, da es sich lediglich um eine ausführbare Binärdatei handelt.


Für die Einbettung von Ressourcen in eine Go-Anwendung stehen mehrere Pakete zur Verfügung:



Ich werde nicht auf die Besonderheiten der einzelnen Bibliotheken eingehen, aber ich bevorzuge den Bindata- Ansatz aufgrund seiner Benutzerfreundlichkeit und aktiven Unterstützung.

Erste Schritte

Erstellen wir zunächst eine index.html im Verzeichnis frontend/ in Ihrem Projekt:

 <html> <body> Hello, World! </body> </html>


Nachdem wir nun ein Projekt eingerichtet und eine statische Ressource zum Testen haben, installieren wir Bindata mit dem folgenden Befehl:

 go get -u github.com/jteeuwen/go-bindata/...


Wir sind bereit, den Backend-Code der Webanwendung auszuführen. Erstellen Sie eine main.go Datei und kopieren Sie den folgenden Code:

 package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) }


Wichtige Zeile in diesem Code:

 //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/...


Die obige Zeile ermöglicht es uns, den Befehl go-bindata auszuführen, wenn go generate aufgerufen wird. Ab Version 1.4 können Sie während der Generierungsphase benutzerdefinierte Befehle ausführen. Sie müssen lediglich //go:generate command argument... zu Ihrer go-Datei hinzufügen.


Die Befehlszeile go-bindata verfügt über mehrere Parameter. Lesen Sie daher in der Dokumentation nach, wie Sie sie verwenden. In unserem Fall sagen wir:


  • -prefix "frontend/" definiert einen Teil des Pfadnamens für statisch


  • -pkg main definiert den Paketnamen, der im generierten Code verwendet wird


  • -o bindata.go definiert den Namen der generierten Datei


Nach dem Ausführen des Befehls go generate sollte eine generierte Datei mit dem Namen bindata.go angezeigt werden. Die Struktur Ihres Projekts sollte wie folgt aussehen:

 . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go


Die Logik zum Bereitstellen statischer Dateien befindet sich in der Funktion static_handler , die die Anfrage empfängt und prüft, ob der Pfad mit dem statischen Pfad übereinstimmt. Die Prüfung erfolgt mithilfe der Asset Funktion, die vom bindata.go Benutzer automatisch exportiert wird. Wenn die Ressource nicht existiert, geben wir eine 404 zurück, andernfalls geben wir den Inhalt der Ressource zurück.


Der Rest des Codes dient zum Erstellen der Webanwendung und zum Binden unserer static_handler Vorlage, damit sie allen eingehenden Anforderungen für / entspricht. Wenn Sie Schwierigkeiten haben, diesen Code zu verstehen, lesen Sie die offizielle Go- Dokumentation für http package .


Als kurze Erinnerung daran, wie Go mit Paketen umgeht: Alle Bezeichner werden automatisch in andere Pakete mit demselben Namen exportiert, wenn der erste Buchstabe des Bezeichnernamens mit einem Großbuchstaben beginnt.


Basierend auf dieser Regel stellt die Datei bindata.go die Asset Funktion für das main bereit. Dadurch wird ein Asset für den angegebenen Namen geladen und zurückgegeben. Es wird ein Fehler zurückgegeben, wenn die Ressource nicht gefunden oder geladen werden kann.