Especificar as dependências

Os aplicativos executados no ambiente de execução padrão do Go 1.12+ podem usar qualquer pacote compatível com Linux/amd64.

O App Engine exige que todas as instruções de importação no código Go especifiquem caminhos absolutos. Por exemplo, use:

import "github.com/example/mypackage"

Usar módulos do Go

Recomendamos que você use módulos do Go para gerenciar dependências no seu appem Go. É possível continuar usando o modo GOPATH mais antigo se não quiser migrar para os módulos do Go.

A partir da versão 1.22 e mais recente do Go:

  • Não é possível usar go get fora de um módulo no modo GOPATH legado (GO111MODULE=off). Para mais informações, consulte Ferramentas.

  • O Go recomenda o uso de um arquivo go.mod para gerenciar dependências. Para instalar dependências durante a implantação, inclua um arquivo go.mod na mesma pasta que o arquivo app.yaml. Para mais informações sobre versões do Go e como gerenciar dependências dos diretórios de fornecedores, consulte GOPATH e módulos.

Quando você implanta o aplicativo, o App Engine usa o comando go build para criar o aplicativo e corresponde ao comportamento do Go. Para garantir que o app use o modo module-aware, realize as seguintes ações no ambiente de desenvolvimento:

  • Crie o arquivo go.mod do módulo no mesmo diretório que seu arquivo app.yaml. O App Engine pesquisa o diretório atual e os diretórios pais sucessivos até encontrar um arquivo go.mod.

    Se o App Engine não encontrar um arquivo go.mod, ele seguirá o modo GOPATH.

  • Se você definir a variável de ambiente GO111MODULE, verifique se o valor dela ativa o modo module-aware. Quando você implanta o aplicativo, o App Engine verifica o ambiente para localizar a variável GO111MODULE e corresponde ao próprio comportamento do Go. O App Engine só aplicará a configuração da variável GO111MODULE se você tiver incluído um arquivo go.mod para o seu app.

  • No Go 1.12, não localize o diretório do app na pasta $GOPATH/src. Se o aplicativo Go 1.12 estiver em qualquer lugar na árvore de diretórios $GOPATH/src, o App Engine seguirá o modo GOPATH, mesmo que você tenha definido um arquivo go.mod para o app.

    Para o Go 1.13 e versões mais recentes, o App Engine usa o modo module-aware por padrão, a menos que GO111MODULE substitua o padrão ou um arquivo go.mod não existe no diretório do app.

Disponibilização de pacotes de terceiros para dependências

A disponibilização de pacotes de terceiros copia os pacotes que seu aplicativo usa para o diretório do aplicativo em vez de fazer o download dos módulos das fontes durante o processo de criação. O Go fornece o comando go build para disponibilizar pacotes de terceiros necessários para seu aplicativo em um diretório chamado vendor no diretório raiz do aplicativo.

No Go 1.14 e em versões posteriores, se o diretório raiz do aplicativo tiver um diretório chamado vendor, o comando go build e o processo de implantação do App Engine usarão os pacotes no diretório do fornecedor em vez de fazer o download de módulos.

No Go 1.13 e versões anteriores, a disponibilização de pacotes de terceiros só estará disponível se você configurar o ambiente para usar o modo GOPATH.

Usar dependências particulares

O App Engine não pode fazer o download das dependências particulares durante o processo de criação. Dessa forma, é necessário incluí-las com o código do app na implantação.

Use a diretiva replace no arquivo go.mod para declarar dependências particulares. O exemplo a seguir supõe que seu aplicativo esteja no diretório /myapp/:

  1. Altere para o diretório do aplicativo:

    cd /myapp
    
  2. Crie um diretório contendo suas dependências particulares:

    mkdir private
    

    Verifique se a dependência particular está no diretório private. Uma abordagem é criar um link simbólico:

    mkdir private/private.example.com
    ln -s /path/to/private.example.com/foo private/private.example.com/foo
    
  3. Atualize o arquivo go.mod para usar a diretiva replace e usar o diretório private para sua dependência:

    go mod edit -replace=private.example.com/foo=./private/private.example.com/foo
    

    Seu arquivo go.mod terá esta aparência:

    Arquivo go.mod final

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
    replace private.example.com/foo => ./private/private.example.com/foo
    

    Arquivo go.mod original

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
  4. Não modifique a forma como você importa e usa seu pacote particular. Sua instrução import ficará assim:

    import "private.example.com/foo"
    
  5. Para incluir a dependência particular na implantação, implante o aplicativo:

    gcloud app deploy