Como especificar dependências no Go

O Cloud Functions no Go precisa fornecer todas as suas dependências por meio de módulos Go com um arquivo go.mod ou um diretório vendor. Sua função não pode especificar dependências usando os módulos Go e um diretório vendor ao mesmo tempo.

O ambiente de execução Go inclui vários pacotes do sistema no ambiente de execução. Se a função usar uma dependência que exija um pacote que não esteja listado, será possível solicitá-lo.

O conteúdo deste documento se aplica ao Go 1.11 e Go 1.13.

Como usar os módulos do Go

O Cloud Functions é compatível com a funcionalidade experimental de módulos (em inglês) do Go, que permite especificar dependências em um arquivo go.mod na raiz do projeto. Ao implantar a função, as dependências especificadas no arquivo go.mod são buscadas e criadas automaticamente.

O comportamento dos módulos Go varia conforme o desenvolvimento ocorre dentro ou fora do GOPATH. Para determinar se você está dentro do GOPATH:

  1. Navegue até o diretório do projeto.

  2. Encontre seu GOPATH executando o comando:

    go env GOPATH
    

    Isso gera uma linha semelhante a:

    GOPATH=YOUR_GOPATH
    
  3. Encontre o diretório de trabalho atual executando:

    pwd
    

Se o diretório de trabalho começa com YOUR_GOPATH, você está dentro do GOPATH. Nesse caso, gere o arquivo go.mod executando os três comandos a seguir:

export GO111MODULE=on
go mod init
go mod tidy

Se o diretório de trabalho não começar com YOUR_GOPATH, você está fora de GOPATH. Nesse caso, gere o arquivo go.mod executando os comandos:

go mod init MODULE
go mod tidy

No exemplo acima, MODULE é o nome do módulo. Por exemplo, o nome do módulo pode ser example.com/myproject (o nome de domínio é obrigatório). O comando go detecta automaticamente o nome do módulo quando você está dentro do GOPATH.

Depois de criar um arquivo go.mod, use o comando go get para buscar dependências e adicioná-las automaticamente ao projeto. Por exemplo:

go get DEPENDENCY

No exemplo acima, DEPENDENCY é uma dependência que você quer adicionar à função. Por exemplo, o comando go get cloud.google.com/go/storage adiciona a biblioteca de cliente do Cloud Storage à sua função.

Como usar um diretório vendor

O Cloud Functions também permite incluir dependências por meio de umdiretório vendor (em inglês). Na maioria das vezes, os diretórios vendor são mantidos com um gerenciador de dependências. É possível usar qualquer gerenciador de dependências que você preferir. Por exemplo, você pode usar a funcionalidade dos módulos do Go para criar um diretório vendor a partir do arquivo go.mod.

Usar um diretório vendor é útil se a dependência não estiver disponível por meio de um gerenciador de dependências ou se o acesso à Internet do ambiente do Cloud Functions for restrito.

Se você tiver um arquivo go.mod e um diretório vendor, o diretório vendorserá ignorado quando você implantar a função. Use um arquivo .gcloudignore (em inglês) para evitar o upload dos arquivos go.mod e go.sum. Nesse caso, o conteúdo do diretório vendor será respeitado:

  1. Crie um arquivo .gcloudignore na raiz do diretório do projeto com o seguinte conteúdo:

    go.mod
    go.sum
    
    # Also ignore Git directories. Delete the following two lines if you want to
    # upload them.
    .git
    .gitignore
    
  2. Crie um diretório vendor com o conteúdo do arquivo go.mod executando o comando a seguir:

    go mod vendor
    

Como usar dependências privadas

Se as dependências da função estiverem hospedadas em um repositório que não é acessível publicamente, use um diretório vendor para buscar as dependências antes de implantar a função. Se você pretende usar um arquivo go.mod, consulte as instruções acima para evitar conflitos entre o arquivo go.mod e o diretório vendor.