Especificar dependências no Ruby

As funções do Cloud Run escritas em Ruby usam o bundler para acessar as dependências. É possível fazer o download das dependências quando a função é implantada ou empacotada localmente junto com a função.

Cada função precisa fornecer um Gemfile que especifique a gem functions_framework, junto com qualquer outra gem necessária para a função. Gemfile precisa estar no mesmo diretório que o arquivo app.rb que contém o código da função. Além disso, a função precisa fornecer um arquivo de bloqueio que especifique todas as dependências transitivas e as respectivas versões. Este arquivo, Gemfile.lock, também está localizado no mesmo diretório junto com Gemfile.

Quando você implanta sua função, as funções do Cloud Run faz o download e instala as dependências declaradas em Gemfile e Gemfile.lock usando bundler.

O Gemfile lista os pacotes obrigatórios para a função junto com as restrições de versão opcionais. Para mais detalhes, consulte a referência do Gemfile.

Veja abaixo um exemplo de Gemfile:

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"
gem "google-cloud-storage", "~> 1.29"

Execute o comando a seguir para instalar a gem functions_framework e outras dependências:

bundle install

A Gemfile.lock é gerada pelo bundler quando ele analisa suas dependências e congela as respectivas versões de cada gem a ser instalada. Isso garante, por exemplo, que a função seja implantada com as mesmas versões de dependência que aquelas usadas nos testes locais. O formato exato de Gemfile.lock é particular para o bundler e não pode ser editado manualmente.

Se você já usou o bundler para instalar suas dependências e executar testes localmente, provavelmente já tem um arquivo Gemfile.lock. Caso contrário, gere um executando:

bundle lock

O Functions Framework é uma dependência necessária para todas as funções. Embora as funções do Cloud Functions o instalem em seu nome quando a função é criada, recomendamos que você a inclua como uma dependência explícita para maior clareza.

Se a função depende de dependências particulares, recomendamos que você espelhe functions-framework no registro particular. Inclua o functions-framework espelhado como uma dependência da sua função para evitar a instalação do pacote pela Internet pública.

Como empacotar dependências locais

Também é possível empacotar e implantar dependências junto com sua função. Essa abordagem é útil se a dependência não estiver disponível por meio do gerenciador de pacotes rubygems.

Para empacotar uma gem localmente, inclua-a em um diretório na estrutura de diretórios da sua função e informe o caminho na entrada Gemfile da dependência. O diretório da gem precisa incluir um arquivo gemspec válido, que precisa estar localizado na hierarquia de diretórios da função para que o código seja implantado com a função. Por exemplo, é possível usar uma estrutura de diretório como a seguinte:

myfunction/
├── Gemfile
├── Gemfile.lock
├── app.rb
└── my_private_gem/
    ├── lib/
    |   └── my_private_gem.rb
    └── my_private_gem.gemspec

A entrada Gemfile pode ter esta aparência:

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"
gem "my_private_gem", path: "./my_private_gem"

Consulte a referência do Gemfile para ver mais discussões sobre como fazer referência a caminhos gem locais.