Go 1.15 ahora está disponible en vista previa.

Migra tu app de App Engine a Go 1.12+

Obtén información sobre cómo migrar la app existente de App Engine desde el entorno de ejecución de Go 1.11 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+ en App Engine

Puedes realizar cambios en tu app existente de Go en App Engine y en tu proceso de implementación a fin de poder usar los entornos de ejecución de Go 1.12+ para App Engine. Las principales diferencias en los entornos de ejecución nuevos 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 mediante 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 la 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 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:

Elemento Tipo de cambio Descripción
runtime Modificado Cambia el elemento runtime para especificar Go 1.12 o superior.
login Obsoleta Los entornos de ejecución de Go 1.12+ no son compatibles con login. Debes usar métodos alternativos para autenticar usuarios.

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

Crea un paquete main

Tu servicio debe incluir una declaración package main en al menos un archivo de origen. Como alternativa, si tu servicio usa el paquete google.golang.org/appengine, incluye una llamada a appengine.Main().

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 de forma manual todas las llamadas http.HandleFunc() de tus paquetes a la función main() en tu paquete main.
  • Como alternativa, puedes importar los paquetes de tu aplicación al paquete main con el fin de asegurarte 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 de bash y copia el resultado en el 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:

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

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

Mueve archivos a tu GOPATH

Encuentra tu GOPATH mediante el siguiente comando:

go env GOPATH

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