Hatch reúne ambientes, scripts, versionamento e build de projetos Python. Sua configuração vive no pyproject.toml, o que ajuda a documentar tarefas sem uma coleção de comandos informais.

Configurar projeto e ambiente

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "exemplo-app"
version = "0.1.0"
requires-python = ">=3.12"

[tool.hatch.envs.test]
dependencies = ["pytest"]

[tool.hatch.envs.test.scripts]
run = "pytest -q {args:tests}"

Depois de instalar Hatch em um ambiente de ferramentas, execute hatch run test:run. O ambiente é criado de forma isolada e o argumento padrão pode ser substituído na linha de comando.

Separar responsabilidades

O backend Hatchling constrói distribuições; o CLI Hatch orquestra tarefas. Essa distinção permite usar Hatchling sem obrigar todos os consumidores do pacote a instalar Hatch. Antes de publicar, execute hatch build, inspecione wheel e sdist e teste a instalação dos artefatos em ambiente limpo.

O guia de pyproject.toml explica os metadados, e uv para projetos Python oferece outra abordagem. Não combine ferramentas com funções sobrepostas sem definir qual delas controla lock, ambientes e build.

A documentação oficial do Hatch, consultada em 22 de julho de 2026, detalha ambientes, scripts e build. Fixe ferramentas na CI e nunca publique em um repositório real a partir de credenciais pessoais sem proteção e revisão.

Separar Hatch de Hatchling

Hatch é a ferramenta de projeto que cria ambientes, executa scripts, atualiza versões e inicia builds. Hatchling é um backend de build compatível com os padrões de empacotamento. O campo build-backend = "hatchling.build" informa a ferramentas como python -m build como produzir wheel e sdist; ele não obriga colaboradores nem consumidores a usar o comando hatch.

Essa separação evita acoplamento desnecessário. Um projeto pode padronizar tarefas com Hatch e ainda gerar artefatos instaláveis por pip. Também pode usar Hatchling como backend e outra ferramenta para ambientes. Escolha um responsável para cada função e registre a decisão.

Declarar metadados e layout

Para uma biblioteca com código em src/exemplo, declare os pacotes de forma explícita:

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "exemplo-util"
version = "0.1.0"
description = "Utilitários para o projeto Exemplo"
readme = "README.md"
requires-python = ">=3.11"
dependencies = ["httpx>=0.27,<1"]

[tool.hatch.build.targets.wheel]
packages = ["src/exemplo"]

O nome de distribuição pode conter hífen, enquanto o pacote importável normalmente usa um identificador Python. Confirme que o wheel contém módulos, tipagem e arquivos de dados necessários. Não inclua testes, segredos ou arquivos locais por acidente.

Organizar ambientes por finalidade

Ambientes independentes impedem que ferramentas de documentação vazem para a execução principal:

[tool.hatch.envs.test]
dependencies = [
  "pytest",
  "pytest-cov",
]

[tool.hatch.envs.test.scripts]
run = "pytest {args:tests}"
cov = "pytest --cov=exemplo --cov-report=term-missing {args:tests}"

[tool.hatch.envs.docs]
dependencies = ["sphinx"]

[tool.hatch.envs.docs.scripts]
build = "sphinx-build -W docs build/docs"

Execute hatch run test:run ou passe um caminho depois do comando. Scripts curtos formam uma interface estável para desenvolvimento e CI. Evite esconder lógica complexa em uma linha TOML; mova fluxos extensos para um módulo Python testável.

Testar várias versões do Python

Matrizes verificam compatibilidade declarada:

[tool.hatch.envs.test]
matrix-name-format = "py{value}"

[[tool.hatch.envs.test.matrix]]
python = ["3.11", "3.12", "3.13"]

Execute a matriz apenas para versões realmente suportadas. Se um interpretador não existir na máquina, instale-o conscientemente ou configure um provedor adequado. Uma execução ignorada não comprova compatibilidade. Na CI, faça a matriz visível para identificar qual versão falhou.

Versionar sem alterar o código manualmente

Hatch pode ler a versão de arquivo ou fonte configurada. Uma única fonte evita divergência entre pacote, metadados e documentação. Antes de automatizar incremento, decida se o projeto segue versionamento semântico e quem autoriza releases.

Não derive versões de estado Git sem considerar builds fora do repositório. Artefatos precisam ter versão determinística, e repetir o build do mesmo commit deve gerar metadados equivalentes.

Construir e inspecionar artefatos

hatch build cria wheel e sdist em dist/. Não publique imediatamente. Liste o conteúdo do wheel, extraia o sdist em diretório temporário e instale ambos em ambientes limpos. Rode ao menos um teste de importação e, para uma CLI, invoque --help.

hatch build
python -m pip install dist/exemplo_util-0.1.0-py3-none-any.whl
python -c "import exemplo; print(exemplo.__name__)"

O nome exato do arquivo depende dos metadados. Em automação, descubra o artefato de maneira controlada e falhe se houver zero ou vários candidatos inesperados.

Publicar com fronteiras claras

Construção e publicação são etapas diferentes. A primeira pode ocorrer em todo pull request; a segunda deve rodar apenas para uma tag ou aprovação protegida. Use tokens de escopo mínimo e publicação confiável quando o repositório de pacotes oferecer essa opção. Nunca imprima credenciais em logs.

Comece por um índice de teste quando o fluxo ainda não foi validado. Confira nome, versão, descrição, arquivos e dependências na página resultante. Se a versão errada for publicada, normalmente não é possível substituir o mesmo número; corrija e publique uma nova versão conforme a política do índice.

Adotar Hatch sem confundir a equipe

Documente comandos essenciais no README: criar ambiente, rodar testes, gerar documentação e construir. Faça a CI chamar os mesmos scripts. Fixe a versão do Hatch usada pela automação ou adote uma política explícita de atualização.

Hatch traz mais valor quando substitui scripts divergentes por uma configuração compreensível. Ele não elimina a necessidade de revisar dependências, testar artefatos e proteger releases. Um projeto previsível deixa claro qual ferramenta resolve dependências, qual cria ambientes, qual constrói e quem pode publicar.