Go 1.13 ahora está disponible a nivel general.

Migra tu aplicación de App Engine a Go 1.12+

Obtén información sobre cómo migrar la app existente de App Engine del entorno de ejecución de Go 1.9 a los entornos de ejecución de Go 1.12+ en el entorno estándar de App Engine.

Cambios en el entorno de ejecución de Go 1.12+ o superior de App Engine

Debes realizar cambios en tu app existente de Go de App Engine y en tu proceso de implementación para usar los entornos de ejecución de Go 1.12 de App Engine o versiones posteriores. Las principales diferencias en los nuevos entornos de ejecución se describen a continuación:

Migra desde el SDK de Go en App Engine

Los paquetes appengine y google.golang.org/appengine ya no son compatibles. Tendrás que migrar a la biblioteca cliente de Google Cloud para acceder a servicios equivalentes de Google Cloud:

  • Usa Cloud Tasks para poner en cola las tareas de Go 1.12 y posteriores con el paquete cloudtasks. Puedes usar cualquier servicio de App Engine como objetivo de una tarea de App Engine.
  • En lugar de la API de correo electrónico de App Engine, usa un proveedor de correo electrónico de terceros como SendGrid, Mailgun o Mailjet para enviar correos electrónicos. Todos estos servicios ofrecen API para enviar correos electrónicos desde las aplicaciones.
  • A fin de almacenar en caché los datos de aplicación, usa Memorystore para Redis.
  • Accede a la API de módulos de App Engine mediante la biblioteca google-api-go-client. Usa las variables de entorno y la API de Administrador de App Engine para obtener información y modificar los servicios en ejecución de tu aplicación:

    Información del servicio Cómo acceder a ella
    Nombre del servicio actual Con la variable de entorno GAE_SERVICE.
    Versión del servicio actual Con la variable de entorno GAE_VERSION.
    ID de instancia actual Con la variable de entorno GAE_INSTANCE.
    Nombre de host predeterminado Método apps.get de la API de Administrador
    Lista de servicios Método apps.services.list de la API de Administrador
    Lista de versiones para un servicio Método apps.services.versions.list de la API de Administrador
    Versión predeterminada para un servicio, incluidas las divisiones del tráfico Método apps.services.get de la API de Administrador
    Lista de instancias en ejecución para una versión Método apps.services.versions.instances.list de la API de Administrador
  • Se recomienda usar Cloud Storage en lugar de la API de Blobstore de App Engine. Usa Cloud Storage mediante el paquete storage. Para comenzar, consulta la página Bibliotecas cliente de Cloud Storage.

  • Accede a Datastore a través del paquete datastore. Para comenzar, consulta la página Bibliotecas cliente de Datastore.

  • En lugar de usar la API de App Engine Search, aloja cualquier base de datos de búsqueda en el texto completo, como ElasticSearch, en Compute Engine y accede a ella desde tu servicio.

  • Usa funcionalidades similares de la API de imágenes de App Engine en Cloud Storage mediante el paquete storage y un servicio de terceros a fin de manipular las imágenes. Para comenzar, consulta la página Bibliotecas cliente de Cloud Storage.

  • Usa request.Context() o tu contexto preferido en lugar de usar appengine.NewContext.

  • Las siguientes funcionalidades específicas de App Engine se sustituyeron por los paquetes de la biblioteca estándar de Go que se enumeran a continuación:

    Paquete de App Engine Paquete de la biblioteca estándar de Go
    Paquete cloudsql Paquete database/sql
    Paquete file Paquete os
    Paquete log Paquete log
    Paquete socket Paquete net
    Paquete urlfetch Paquete net/http

Cambios en el archivo app.yaml

Se modificó el comportamiento de algunos elementos del archivo de configuración app.yaml:

Element Tipo de cambio Descripción
api_version Obsoleto
runtime Modificado Cambia el elemento runtime a [especificar Go 1.12 o superior](/appengine/docs/standard/go/config/appref#runtime).
application_readable Obsoleta
builtins Obsoleto
includes Obsoleto
login Obsoleta Los entornos de ejecución de Go 1.12+ no son compatibles con login. Debes usar métodos alternativos para autenticar usuarios.
libraries Obsoleta
threadsafe Obsoleto Se supone que todas las aplicaciones son seguras para los subprocesos, por lo que una instancia puede manejar varias solicitudes al mismo tiempo.
skip_files Obsoleta En su lugar, crea un archivo .gcloudignore en el directorio raíz en el que se encuentra tu archivo app.yaml. Para obtener más información, consulta la referencia .gcloudignore.

Para obtener más información, consulta la referencia app.yaml.

Crea un paquete main

Tu servicio debe incluir una declaración package main en al menos un archivo fuente.

Escribe un paquete main

Si tu servicio aún no contiene un paquete main, agrega la declaración package main y escribe una función main(). Como mínimo, la función main() debe hacer lo siguiente:

  • Leer la variable de entorno PORT y llamar a la función http.ListenAndServe():

    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)
    }

Registra tus controladores HTTP

Puedes registrar tus controladores HTTP si seleccionas una de las siguientes opciones:

  • El método preferido es mover manualmente todas las llamadas http.HandleFunc() de tus paquetes a tu función main() en tu paquete main.
  • También puedes importar los paquetes de tu aplicación en tu paquete main, asegurándote de que cada función init() que contiene llamadas a http.HandleFunc() se ejecute al inicio.

    Puedes encontrar todos los paquetes que usan la llamada http.HandleFunc() con la siguiente secuencia de comandos bash y copia el resultado en tu bloque import del paquete main:

    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
    

Estructura tus archivos

Go requiere que cada paquete tenga su propio directorio. Puedes indicarle a App Engine dónde está tu paquete main mediante main: en el archivo app.yaml de tu proyecto. Por ejemplo, si la estructura de archivos de tu aplicación se ve así:

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

Tu archivo app.yaml tendría lo siguiente que hacer lo siguiente:

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

Para obtener más información sobre la marca main, consulta la referencia app.yaml.

Mueve archivos a tu GOPATH

Encuentra tu GOPATH con el siguiente comando:

go env GOPATH

Mueve todos los archivos y las importaciones relevantes a tu GOPATH. Si usas importaciones relativas, como import ./guestbook, actualiza tus importaciones para usar la ruta completa: import github.com/example/myapp/guestbook.