Dependências
Não há arquivo de requirements para manter. O Waiso lê os imports do código, descobre o pacote de cada um e instala no worker antes de o main rodar. Em Python dá para fixar uma versão, acrescentar um pacote que o código carrega pelo nome ou trocar o pacote de um import no painel Dependências — e publicar congela as versões exatas, então um lançamento novo do pacote nunca muda um script publicado.
- Ver como um import Python vira um pacote do PyPI (
yaml→ PyYAML) - Fixar, acrescentar e trocar pacotes no painel Dependências
- Saber o que a publicação trava e como atualizar
- Entender os quatro erros de instalação e corrigi-los
Os imports são a lista de dependências
Cada linguagem é lida do seu jeito. Os imports de Python são lidos com o próprio parser do Python em qualquer profundidade — dentro de funções, blocos try e condicionais também — e a biblioteca padrão e os scripts do seu projeto ficam de fora. Os imports de TypeScript e JavaScript (import … from, import(), require()) são instalados com o Bun. C e C++ não instalam nada: usam os headers do sistema que vêm no worker.
import yaml # installs the PyPI package PyYAML
def main(config: str = "name: nightly\nretries: 3\n"):
data = yaml.safe_load(config)
return {"name": data["name"], "retries": data["retries"]}{
"name": "nightly",
"retries": 3
}A primeira execução de um conjunto novo de pacotes mostra a instalação em Logs; depois o worker reaproveita o cache e a execução começa na hora. Um import que não está no código não é instalado — não há nada a declarar para pacotes que o código já importa.
Python: do import ao pacote
Muitos pacotes são importados por um nome diferente do nome que se instala. O Waiso mantém um mapa deles — cerca de 150 entradas, vale o caminho de módulo mais longo que bater — e o que não está no mapa é tentado pelo próprio nome.
| Você escreve | O Waiso instala |
|---|---|
import yaml | PyYAML |
from PIL import Image | Pillow |
from bs4 import BeautifulSoup | beautifulsoup4 |
import cv2 | opencv-python-headless |
from sklearn import … | scikit-learn |
from dateutil import parser | python-dateutil |
import jwt | PyJWT |
from google.cloud import storage | google-cloud-storage (por regra) |
def main(width: int = 64, height: int = 64):
# An import inside a function is found too: Pillow is installed.
from PIL import Image
img = Image.new("RGB", (width, height), "white")
return {"size": list(img.size), "mode": img.mode}O painel Dependências
Um script Python tem a aba Dependências no painel lateral do editor, com a contagem de pacotes. Cada linha é um import e o pacote que ele instala, com um chip: detectado (achado no código), declarado (salvo no painel), comentário (um comentário antigo) e, depois de publicar, fixado. Um import que o mapa não conhece mostra Nenhum pacote com esse nome e um botão Declarar pacote; uma execução ainda tenta instalá-lo pelo próprio nome.
- Fixe uma versão
Clique em Trocar o pacote deste import numa linha detectada, digite um especificador em Versão —
==2.31.0ou>=2,<3; vazio é a mais recente — e clique em Salvar. A linha vira declarado. - Acrescente um pacote que o código não importa
Adicionar pacote declara um pelo nome — para um plugin que uma biblioteca carrega sozinha, ou para Extras como
requests[socks]. - Troque o pacote de um import
Numa linha detectada, o mesmo botão deixa você indicar outro pacote para aquele import — por exemplo o
opencv-pythoncompleto em vez da versão headless.
Comentários antigos
Scripts antigos podem ter comentários de linha inteira como # @requests@2.31.0. Eles ainda valem, com a versão — mas só nesse formato exato: um comentário sozinho na linha, #, @, o pacote e um @versão opcional. Quando o painel os encontra, ele avisa Há pacotes declarados em comentários do código e oferece Mover para o painel, para que fiquem salvos com o script.
Publicar trava as versões
Uma execução do rascunho resolve os pacotes — as versões mais novas que as declarações permitem — e registra o que instalou. Publicar congela essa resolução como o lock do script: cada pacote, inclusive os que vieram puxados por outros, com a versão exata. A versão publicada passa a instalar sempre exatamente ==versão de cada um, sem resolver de novo, então agendamentos, a API e os flows continuam rodando o que você testou.
Para pegar versões mais novas, clique em Atualizar dependências no rodapé do painel: a próxima execução do rascunho resolve de novo, e a próxima publicação congela isso. Até lá a versão publicada mantém o lock.
TypeScript e JavaScript
Todo pacote que um import nomeia é instalado com bun install quando o script roda — a versão latest, na primeira vez que um certo código roda num worker; o mesmo código reaproveita essa instalação depois. Pacotes com escopo (@scope/pkg) funcionam; um subcaminho (lodash/fp) instala o pacote base. Caminhos relativos são os scripts do seu projeto, e os módulos node: e bun: já vêm embutidos.
No editor, cada linha de import tem um indicador com o estado — instalando, instalado ou com erro — e clicar nele abre um seletor de versão. A versão escolhida vira um comentário no fim da linha, import _ from 'lodash' // @4.17.21, que define a versão que o editor instala para tipos e sugestões.
Quando uma instalação falha
Uma execução Python cujos pacotes não instalam falha antes de o main começar, com um de quatro códigos. O erro nomeia o pacote — e o import e a linha que o pediram — e as linhas do próprio pip ficam em Logs. Quando a instalação do próprio editor falha, a aba Problemas também mostra isso na linha do import.
| Código | Significado | Correção |
|---|---|---|
dependency_not_found | Nenhum pacote com esse nome no índice — em geral um import cujo nome de instalação é outro | Indique o pacote certo para o import no painel |
dependency_version_not_found | O pacote existe, mas nenhuma versão atende o especificador, ou dois requisitos conflitam | Afrouxe ou corrija a versão |
dependency_index_unreachable | O worker não alcançou o índice de pacotes | Execute de novo; se repetir, fale com o administrador |
dependency_build_failed | O pip achou o pacote mas não conseguiu compilar ou instalar | Escolha uma versão que tenha wheel |
Could not install the package for `import sklern` (tried `sklern`). Declare the package explicitly: open Dependencies and add the package that provides `sklern`
Limites
- Scripts não têm acesso à rede; só a etapa de pacotes do worker alcança o índice, e um administrador pode bloquear ou restringir nomes de pacotes.
- Um import TypeScript só de efeito, sem nada importado (
import 'pkg'), não é instalado — importe algo dele. - O painel Dependências e o lock são só de Python; C e C++ não instalam pacotes.
- No máximo 100 declarações por script.