O Go 1.15 já está disponível.

Como migrar o aplicativo do App Engine para o Go 1.12+

Saiba como migrar o aplicativo do App Engine atual do ambiente de execução do Go 1.11 para os ambientes de execução do Go 1.12+ do ambiente padrão do App Engine.

Alterações no ambiente de execução do Go 1.12+ do App Engine

É possível fazer alterações no aplicativo Go do App Engine e no processo de implantação para usar os ambientes de execução do App Engine Go 1.12+. As principais diferenças nos novos ambientes de execução estão descritas abaixo:

Como migrar do SDK do App Engine para Go

O pacote appengine e o pacote google.golang.org/appengine não são mais compatíveis. Será preciso migrar para a biblioteca de cliente do Google Cloud para acessar serviços equivalentes do Google Cloud:

  • Use o Cloud Tasks para enfileirar tarefas do Go 1.12 e mais recente usando o pacote cloudtasks. Use qualquer serviço do App Engine como o destino de uma tarefa do App Engine.
  • Em vez da API App Engine Mail, use um provedor de e-mail de terceiros, como SendGrid, Mailgun ou Mailjet para enviar e-mails. Todos esses serviços oferecem APIs para enviar e-mails de aplicativos.
  • Para armazenar os dados do aplicativo em cache, use o Memorystore para Redis.
  • Acesse a API Modules do App Engine usando a biblioteca google-api-go-client. Use as variáveis de ambiente e a API App Engine Admin para receber informações e modificar os serviços em execução do aplicativo:

    Informações de serviços Como acessar
    Nome do serviço atual Por meio da variável de ambiente GAE_SERVICE.
    Versão do serviço atual Por meio da variável de ambiente GAE_VERSION.
    ID da instância atual Por meio da variável de ambiente GAE_INSTANCE.
    Nome do host padrão Método apps.get da API Admin
    Lista de serviços Método apps.services.list da API Admin
    Lista de versões de um serviço Método apps.services.versions.list da API Admin
    Versão padrão de um serviço, incluindo qualquer divisão de tráfego Método apps.services.get da API Admin
    Lista de instâncias em execução de uma versão Método apps.services.versions.instances.list da API Admin
  • O Cloud Storage é recomendado em vez de usar a API Blobstore do App Engine. Use o Cloud Storage por meio do pacote storage. Para começar, consulte a página Bibliotecas de cliente do Cloud Storage.

  • Acesse Datastore por meio do pacote datastore. Para começar, consulte a página Bibliotecas de cliente do Datastore.

  • Em vez de usar a API App Engine Search, hospede qualquer banco de dados de pesquisa de texto completo, como o ElasticSearch no Compute Engine, e acesse-o do serviço.

  • Use funcionalidades semelhantes fornecidas pela API Images do App Engine no Cloud Storage por meio do pacote storage e de um serviço de terceiros para manipular imagens. Para começar, consulte a página Bibliotecas de cliente do Cloud Storage.

  • Use request.Context() ou seu contexto preferido em vez de usar appengine.NewContext.

  • As seguintes funcionalidades específicas do App Engine foram substituídas pelos pacotes da biblioteca padrão do Go listados abaixo:

    Pacote do App Engine Pacote da biblioteca padrão do Go
    Pacote cloudsql Pacote database/sql
    Pacote file Pacote os
    Pacote log Pacote log
    Pacote socket Pacote net
    Pacote urlfetch Pacote net/http

Alterações no arquivo app.yaml

O comportamento de alguns elementos no arquivo de configuração app.yaml foi modificado:

Elemento Tipo de alteração Descrição
runtime Modificado Altere o elemento runtime para especificar o Go 1.12 ou superior.
login Obsoleto Os ambientes de execução do Go 1.12+ não são compatíveis com login. É preciso usar métodos alternativos para autenticar usuários.

Para obter mais informações, consulte a referência app.yaml.

Como criar um pacote main

O serviço precisa incluir uma instrução package main em pelo menos um arquivo de origem. Como alternativa, se o serviço estiver usando o pacote google.golang.org/appengine, inclua uma chamada para appengine.Main().

Como gravar um pacote principal

Se o serviço ainda não tiver um pacote main, adicione a instrução package main e grave uma função main(). No mínimo, a função main() precisa:

  • Ler a variável de ambiente PORT e chamar a função 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)
    }

Como registrar os gerenciadores HTTP

É possível registrar seus gerenciadores HTTP escolhendo uma das seguintes opções:

  • O método preferido é mover manualmente todas as chamadas http.HandleFunc() dos seus pacotes para a função main() no pacote main.
  • Como alternativa, importe os pacotes do aplicativo para o pacote main, garantindo que cada função init() que contém chamadas para http.HandleFunc() seja executada na inicialização.

    É possível todos os pacotes que usam a chamada http.HandleFunc() com o script bash a seguir e copiar a saída para o bloco import do pacote 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
    

Como estruturar seus arquivos

O Go requer que cada pacote tenha o próprio diretório. É possível informar ao App Engine onde está seu pacote main usando main: no arquivo app.yaml do projeto. Por exemplo, se a estrutura de arquivos do aplicativo tiver esta aparência:

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

O arquivo app.yaml teria:

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

Para obter mais informações sobre a sinalização main, consulte a referência de app.yaml.

Como mover arquivos para o GOPATH

Encontre o GOPATH usando o seguinte comando:

go env GOPATH

Mova todos os arquivos relevantes e importa para GOPATH. Se estiver usando importações relativas, como import ./guestbook, atualize as importações para usar o caminho completo: import github.com/example/myapp/guestbook.