Go 1.15 ist jetzt als Vorschau verfügbar.

App Engine-Anwendungen zu Go 1.12+ migrieren

Erfahren Sie, wie Sie Ihre vorhandene App Engine-Anwendung von der Go 1.11-Laufzeit zu den Laufzeiten von Go 1.12+ der App Engine-Standardumgebung migrieren.

Änderungen in der App Engine Go 1.12+-Laufzeit

Sie können Änderungen an Ihrer vorhandenen App Engine Go-Anwendung und an Ihrem Bereitstellungsprozess vornehmen, um die Laufzeiten von App Engine Go 1.12+ zu verwenden. Die wichtigsten Unterschiede bei den neuen Laufzeiten sind im Folgenden aufgeführt:

Aus App Engine Go SDK migrieren

Das Paket appengine und das Paket google.golang.org/appengine werden nicht mehr unterstützt. Sie müssen zur Google Cloud-Clientbibliothek migrieren, um auf entsprechende Google Cloud-Dienste zugreifen zu können:

  • Verwenden Sie Cloud Tasks, um Aufgaben aus Go 1.12 und höher mithilfe des cloudtasks-Pakets in eine Warteschlange zu stellen. Sie können einen beliebigen App Engine-Dienst als Ziel einer App Engine-Aufgabe verwenden.
  • Zum Senden von E-Mails verwenden Sie anstelle der App Engine Mail API einen externen E-Mail-Anbieter wie SendGrid, Mailgun oder Mailjet. Alle diese Dienste bieten APIs zum Senden von E-Mails aus Anwendungen.
  • Verwenden Sie zum Speichern von Anwendungsdaten Memorystore for Redis.
  • Greifen Sie über die Bibliothek google-api-go-client auf die App Engine Modules API zu. Mit den Umgebungsvariablen und der App Engine Admin API können Sie Informationen abrufen und die ausgeführten Dienste der Anwendung ändern:

    Dienstinformation Zugriff
    Aktueller Dienstname Umgebungsvariable GAE_SERVICE
    Aktuelle Dienstversion Umgebungsvariable GAE_VERSION
    Aktuelle Instanz-ID Umgebungsvariable GAE_INSTANCE
    Standardhostname Admin API-Methode apps.get
    Liste der Dienste Admin API-Methode apps.services.list
    Liste der Versionen für einen Dienst Admin API-Methode apps.services.versions.list
    Standardversion für einen Dienst, inklusive Traffic-Aufteilung Admin API-Methode apps.services.get
    Liste der für eine Version ausgeführten Instanzen Admin API-Methode apps.services.versions.instances.list
  • Anstelle der App Engine Blobstore API wird Cloud Storage empfohlen. Verwenden Sie Cloud Storage über das Paket storage. Informationen zur Einrichtung finden Sie auf der Seite Cloud Storage-Clientbibliotheken.

  • Greifen Sie über das Paket datastore auf Datastore zu. Eine Einführung finden Sie auf der Seite Datastore-Clientbibliotheken.

  • Statt die App Engine Search API zu nutzen, können Sie eine beliebige Volltextsuchdatenbank wie ElasticSearch in Compute Engine hosten und über Ihren Dienst darauf zugreifen.

  • Ähnliche Funktionen wie die der App Engine Images API können Sie in Cloud Storage über das Paket storage und einen Drittanbieterdienst zur Bildbearbeitung nutzen. Informationen zur Einrichtung finden Sie auf der Seite Cloud Storage-Clientbibliotheken.

  • Verwenden Sie request.Context() oder Ihren bevorzugten Kontext anstelle von appengine.NewContext.

  • Die folgenden App Engine-spezifischen Funktionen wurden durch die unten aufgeführten Pakete der Go-Standardbibliothek ersetzt:

    App Engine-Paket Paket der Go-Standardbibliothek
    Paket cloudsql Paket database/sql
    Paket file Paket os
    Paket log Paket log
    Paket socket Paket net
    Paket urlfetch Paket net/http

Änderungen an der Datei app.yaml

Das Verhalten einiger Elemente in der Konfigurationsdatei app.yaml wurde geändert:

Element Änderungstyp Beschreibung
runtime Geändert Ändern Sie das Element runtime so, dass Go  1.12 oder höher angegeben wird.
login Veraltet Die Laufzeiten von Go 1.12+ unterstützen login nicht. Sie müssen daher andere Verfahren zur Nutzerauthentifizierung verwenden.

Weitere Informationen finden Sie in der Referenz zu app.yaml.

main-Paket erstellen

Ihr Dienst muss in mindestens einer Quelldatei eine package main-Anweisung enthalten. Alternativ können Sie einen Aufruf von appengine.Main() hinzufügen, wenn Ihr Dienst das Paket google.golang.org/appengine verwendet.

main-Paket schreiben

Wenn Ihr Dienst noch kein main-Paket enthält, fügen Sie die Anweisung package main hinzu und schreiben Sie eine main()-Funktion. Die Funktion main() muss mindestens:

  • Die Umgebungsvariable PORT lesen und die Funktion http.ListenAndServe() aufrufen:

    port := os.Getenv("PORT")
    if port == "" {
    	port = "8080"
    	log.Printf("Defaulting to port %s", port)
    }
    
    log.Printf("Listening on port %s", port)
    if err := http.ListenAndServe(":"+port, nil); err != nil {
    	log.Fatal(err)
    }

HTTP-Handler registrieren

Wählen Sie eine der folgenden Optionen, mit denen sich HTTP-Handler registrieren lassen:

  • Die bevorzugte Methode besteht darin, alle http.HandleFunc()-Aufrufe von Ihren Paketen manuell in die main()-Funktion in Ihrem main-Paket zu verschieben.
  • Alternativ können Sie die Pakete Ihrer Anwendung in das main-Paket importieren. Bei dieser Vorgehensweise müssen Sie gewährleisten, dass jede init()-Funktion, die Aufrufe von http.HandleFunc() enthält, beim Start ausgeführt wird.

    Sie können alle Pakete, die den http.HandleFunc()-Aufruf verwenden, mit dem folgenden Bash-Skript finden und die Ausgabe in den import-Block Ihres main-Pakets kopieren:

    gp=$(go env GOPATH) && p=$(pwd) && pkg=${p#"$gp/src/"} && find . -name "*.go" | xargs grep "http.HandleFunc" --files-with-matches | grep -v vendor/ | grep -v '/main.go' | sed "s#\./\(.*\)/[^/]\+\.go#\t_ \"$pkg/\1\"#" | sort | uniq
    

Dateien strukturieren

Go erfordert, dass jedes Paket über ein eigenes Verzeichnis verfügt. Sie können App Engine mitteilen, wo sich Ihr main-Paket befindet, indem Sie main: in der app.yaml-Datei Ihres Projekts verwenden. Beispiel: Wenn die Dateistruktur Ihrer Anwendung so aussieht:

myapp/
├── app.yaml
├── foo.go
├── bar.go
└── web/
    └── main.go

Hätte Ihre app.yaml-Datei Folgendes:

main: ./web # Relative filepath to the directory containing your main package.

Weitere Informationen zum Flag main finden Sie in der app.yaml-Referenz.

Dateien in GOPATH verschieben

Ihren GOPATH finden Sie mit dem folgenden Befehl:

go env GOPATH

Verschieben Sie alle relevanten Dateien und Importe in GOPATH. Wenn Sie relative Importe wie import ./guestbook verwenden, aktualisieren Sie Ihre Importe, um den vollständigen Pfad zu verwenden: import github.com/example/myapp/guestbook.