Como especificar dependências no Python

Há duas maneiras de especificar dependências para o Cloud Functions gravadas no Python: com o uso do arquivo requirements.txt do gerenciador de pacotes pip ou o com o empacotamento de dependências locais com a função.

Atualmente, a especificação de dependência que usa o padrão Pipfile/Pipfile.lock não é compatível. Seu projeto não deve incluir esses arquivos.

Como especificar dependências com pip

Dependências no Python são gerenciadas com pip e expressas em um arquivo de metadados chamado requirements.txt. O arquivo precisa estar no mesmo diretório que o arquivo main.py que contém o código da função.

Quando você implanta sua função, o Cloud Functions faz o download e instala as dependências declaradas no arquivo requirements.txt usando pip.

O arquivo requirements.txt contém uma linha por pacote. Cada linha contém o nome do pacote e, como opção, a versão solicitada. Para mais detalhes, consulte a referência do requirements.txt.

A seguir, um exemplo de arquivo requirements.txt:

requests==2.20.0
numpy

Como empacotar dependências locais

Também é possível empacotar e implantar dependências junto com sua função. Essa abordagem é útil se sua dependência não estiver disponível por meio do gerenciador de pacotes pip ou se o acesso à Internet do ambiente do Cloud Functions for restrito.

Por exemplo, é possível usar uma estrutura de diretório como a seguinte:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Você pode importar o código normalmente de localpackage usando a seguinte instrução import.

# Code in main.py
from localpackage import script

Observe que essa abordagem não executará nenhum arquivo setup.py. Pacotes com esses arquivos ainda podem ser agrupados, mas podem não ser executados corretamente no Cloud Functions.

Como usar dependências privadas

Dependências particulares do Artifact Registry

Um repositório Python do Artifact Registry pode hospedar dependências particulares para sua função Python. Ao implantar no Cloud Functions, o processo de compilação gerará automaticamente credenciais do Artifact Registry para a conta de serviço do Cloud Build. Só é preciso incluir o URL do Artifact Registry no requirements.txt sem gerar outras credenciais. Exemplo:

--extra-index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

Dependências particulares de outros repositórios

As dependências são instaladas em um ambiente Cloud Build, que não fornece acesso a chaves SSH. Os pacotes hospedados em repositórios que requerem autenticação baseada em SSH precisam ser fornecidos e carregados junto com o código do seu projeto, conforme descrito na seção anterior.

Use o comando pip install com a sinalização -t DIRECTORY para copiar dependências privadas em um diretório local antes de implantar o aplicativo, da seguinte maneira:

  1. Copie sua dependência em um diretório local:

    pip install -t DIRECTORY DEPENDENCY
  2. Adicione um arquivo __init__.py vazio ao diretório DIRECTORY para transformá-lo em um módulo.

  3. Importe deste módulo para usar sua dependência:

    import DIRECTORY.DEPENDENCY

Pacotes pré-instalados

Os seguintes pacotes do Python são instalados automaticamente junto com sua função durante a implantação. Se estiver usando qualquer um desses pacotes no código de função, recomendamos incluir as seguintes versões em seu arquivo requirements.txt:

Python 3.7

aiohttp==3.6.2
async-timeout==3.0.1
attrs==19.3.0
cachetools==4.1.1
certifi==2020.6.20
chardet==3.0.4
click==7.1.2
Flask==1.1.2
google-api-core==1.21.0
google-api-python-client==1.10.0
google-auth==1.19.2
google-auth-httplib2==0.0.4
google-cloud-core==1.3.0
google-cloud-trace==0.23.0
googleapis-common-protos==1.52.0
grpcio==1.30.0
httplib2==0.18.1
idna==2.9
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
multidict==4.7.6
opencensus==0.7.9
opencensus-context==0.1.1
pip==20.1.1
protobuf==3.12.2
pyasn1==0.4.8
pyasn1-modules==0.2.8
pytz==2020.1
PyYAML==5.3.1
requests==2.24.0
rsa==4.6
setuptools==47.3.1
six==1.15.0
uritemplate==3.0.1
urllib3==1.25.9
Werkzeug==1.0.1
wheel==0.34.2
wrapt==1.12.1
yarl==1.5.1

Python 3.8

cachetools==4.2.2
certifi==2021.5.30
charset-normalizer==2.0.6
click==7.1.2
cloudevents==1.2.0
deprecation==2.1.0
flask==1.1.2
functions-framework==2.2.1
google-auth==2.2.0
gunicorn==20.0.4
idna==3.2
itsdangerous==1.1.0
jinja2==2.11.2
markupsafe==1.1.1
packaging==21.0
pathtools==0.1.2
pip==21.1.1
pyasn1-modules==0.2.8
pyasn1==0.4.8
pyparsing==2.4.7
requests==2.26.0
rsa==4.7.2
setuptools==58.1.0
urllib3==1.26.7
watchdog==1.0.2
werkzeug==1.0.1

Python 3.9

click==7.1.2
cloudevents==1.2.0
deprecation==2.1.0
Flask==1.1.2
functions-framework==2.2.1
gunicorn==20.0.4
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
pathtools==0.1.2
watchdog==1.0.2
Werkzeug==1.0.1

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