Especifique dependências

As apps executadas no tempo de execução padrão do Go 1.12 ou superior podem usar qualquer pacote compatível com linux/amd64.

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

import "github.com/example/mypackage"

Use módulos Go

Recomendamos que use módulos Go para gerir dependências na sua app Go. Pode continuar a usar o modo GOPATH mais antigo se não estiver pronto para migrar para módulos Go.

A partir da versão 1.22 e posteriores do Go:

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

  • O Go recomenda que use um ficheiro go.mod para gerir dependências. Para instalar dependências durante a implementação, inclua um ficheiro go.mod na mesma pasta que o ficheiro app.yaml. Para mais informações sobre as versões do Go e a gestão de dependências para diretórios de fornecedores, consulte os artigos GOPATH e Módulos.

Quando implementa a sua app, o App Engine usa o comando go build para criar a app e corresponde ao comportamento do próprio Go. Para garantir que a sua app usa o modo module-aware, faça o seguinte no seu ambiente de desenvolvimento:

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

    Se o App Engine não encontrar um ficheiro go.mod, segue o modo GOPATH.

  • Se definir a variável de ambiente GO111MODULE, certifique-se de que o valor da variável ativa o modo module-aware. Quando implementa a sua app, o App Engine verifica o seu ambiente para GO111MODULE e corresponde ao comportamento do próprio Go. O App Engine só aplica a definição da variável GO111MODULE se tiver incluído um ficheiro go.mod para a sua app.

  • Para o Go 1.12, não localize o diretório da app na pasta $GOPATH/src. Se a sua app Go 1.12 estiver em qualquer parte da árvore de diretórios $GOPATH/src, o App Engine segue o modo GOPATH, mesmo que tenha definido um ficheiro go.mod para a sua app.

    Para o Go 1.13 e posterior, o App Engine usa o modo module-aware por predefinição, a menos que GO111MODULE substitua a predefinição ou não exista um ficheiro go.mod no diretório da app.

Fornecimento de dependências

A venda copia os pacotes que a sua app usa para o diretório da aplicação, em vez de transferir módulos das respetivas origens durante o processo de compilação. O Go fornece o comando go build para fornecer os pacotes de que a sua app precisa num diretório denominado vendor no diretório raiz da sua app.

No Go 1.14 e posterior, se o diretório raiz da sua app contiver um diretório com o nome vendor, o comando go build e o processo de implementação do App Engine usam os pacotes no diretório vendor em vez de transferirem módulos.

No Go 1.13 e anterior, o fornecimento só está disponível se configurar o seu ambiente para usar o modo GOPATH.

Use dependências privadas

O App Engine não consegue transferir as suas dependências privadas durante o processo de compilação, pelo que tem de incluir as dependências com o código da aplicação na implementação.

Use a diretiva replace no ficheiro go.mod para declarar dependências privadas. O exemplo seguinte pressupõe que a sua app está no diretório /myapp/:

  1. Altere para o diretório da app:

    cd /myapp
    
  2. Crie um diretório que contenha as suas dependências privadas:

    mkdir private
    

    Certifique-se de que a dependência privada está no diretório private. Uma das abordagens é 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 ficheiro go.mod para usar a diretiva replace para usar o diretório private para a sua dependência:

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

    O seu ficheiro go.mod deve ter agora o seguinte aspeto:

    Ficheiro 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
    

    Ficheiro go.mod original

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
  4. Não modifique a forma como importa e usa o seu pacote privado. A sua declaração import deve ter o seguinte aspeto:

    import "private.example.com/foo"
    
  5. Inclua a sua dependência privada na implementação implementando a sua app:

    gcloud app deploy