Trilha de aprendizado · Nível 15 · Tutorial 6

Configurar uma distribuição com pyproject.toml

Preparar o projeto para instalação, declarando seus metadados, dependências e comando de terminal em pyproject.toml.

  • Nível: Intermediário
  • Duração: 25 min
  • 8 passos
Configurar uma distribuição com pyproject.toml

O que você vai percorrer

  1. Identificar o papel do pyproject.toml Reconheça o que o pyproject.toml configura e o que continua sendo responsabilidade da configuração usada pela aplicação. 2 min
  2. Organizar o código no layout src Crie uma estrutura local em que o pacote importável fica em src/tarefas, separado dos arquivos de configuração e documentação da raiz. 3 min
  3. Configurar o backend e a descoberta de pacotes Configure o setuptools para construir o projeto e localizar o pacote tarefas dentro de src. 3 min
  4. Declarar identidade e compatibilidade Defina metadados estáticos da distribuição, conecte o README existente e declare uma versão mínima de Python coerente com o uso de tomllib. 3 min
  5. Separar dependências de execução e desenvolvimento Classifique requisitos do projeto para declarar somente o necessário em cada parte do pyproject.toml. 4 min
  6. Registrar as duas formas de iniciar a CLI Configure o comando instalável e a execução com python -m para que ambos usem a mesma função main. 4 min
  7. Verificar a instalação editável Instale o projeto em modo editável e confira as duas formas de iniciar a CLI durante o desenvolvimento. 4 min
  8. Revisar a configuração como um conjunto Revise as relações entre a árvore de arquivos, o pyproject.toml e as entradas da CLI antes de avançar para a geração de distribuições. 3 min

O que você vai aprender

  • Organizar o código importável no layout src e configurar sua descoberta pelo backend.
  • Declarar metadados estáticos e requisitos de execução compatíveis com o código utilizado.
  • Separar dependências normais de ferramentas opcionais de desenvolvimento.
  • Registrar um comando instalável e verificar a instalação editável durante o desenvolvimento.

Antes de começar

  • Traduzir falhas em mensagens e códigos de saída
  • Criar ambientes virtuais com venv
  • Instalar pacotes com pip no ambiente correto
  • Organizar módulos em pacotes locais

Passo 1 de 8

Identificar o papel do pyproject.toml

Reconheça o que o pyproject.toml configura e o que continua sendo responsabilidade da configuração usada pela aplicação.

Um arquivo para a distribuição

Na raiz do projeto

O pyproject.toml fica na raiz do projeto. Ele é o ponto central para declarar como a distribuição Python será construída, qual é sua identidade e quais ferramentas podem ter configurações próprias.

Ele descreve o projeto para ferramentas do ecossistema Python; não é, por si só, o arquivo de preferências que sua aplicação lê ao executar.

Dois tipos de configuração

Compare a configuração da distribuição com a configuração de uso da CLI.

Diagrama mostrando a raiz de um projeto com pyproject.toml ligado a construção, metadados e ferramentas, enquanto um arquivo separado de configuração alimenta a execução da CLI.

pyproject.toml orienta o ecossistema de empacotamento; a CLI pode ler outro arquivo para obter suas preferências.

Dica

Regra prática

Pergunte: “isto informa como o projeto é distribuído ou é uma preferência para a aplicação rodar?”. No primeiro caso, tende a pertencer ao pyproject.toml; no segundo, tende a pertencer ao arquivo de configuração da aplicação.

Três áreas, três responsabilidades

Mapa inicial das tabelas

Sem preencher opções ainda, pense nas tabelas mais comuns assim:

  • [build-system]: informa os recursos usados para construir a distribuição.
  • [project]: reúne os metadados e requisitos da distribuição.
  • [tool.*]: reserva espaços para configurações de ferramentas, como analisadores e testes.

As tabelas organizam responsabilidades diferentes no mesmo arquivo.

Exemplo

Um esqueleto, não uma configuração pronta

[build-system]
# Como a distribuição será construída

[project]
# Identidade e requisitos da distribuição

[tool.alguuma-ferramenta]
# Preferências desta ferramenta

Neste momento, o objetivo é reconhecer o papel de cada área. Os campos concretos serão adicionados nos próximos passos.

Três nomes que podem coincidir

Distribuição, pacote e comando

No projeto contínuo deste tutorial, os três nomes abaixo se referem a papéis distintos, embora dois deles tenham o mesmo texto:

  • tarefas-cli: nome da distribuição que será instalada.
  • tarefas: nome do pacote importável, usado por exemplo em import tarefas.
  • tarefas: nome do comando de terminal, usado como tarefas.

O nome da distribuição não precisa ser igual ao nome do pacote importável nem ao do comando.

Papéis separados

O mesmo projeto pode expor uma identidade de distribuição e interfaces de uso diferentes.

Diagrama com uma caixa de distribuição chamada tarefas-cli ligada a um pacote Python tarefas e a um terminal usando o comando tarefas.

Distribuição, pacote e comando se relacionam, mas são identificadores com funções diferentes.

Prática: escolha o lugar certo

Associe cada informação ao lugar adequado

Relacione cada informação ao local que normalmente deve recebê-la neste projeto.

Toque em um item e depois no par correspondente.

Passo 2 de 8

Organizar o código no layout src

Crie uma estrutura local em que o pacote importável fica em src/tarefas, separado dos arquivos de configuração e documentação da raiz.

A árvore separa código e projeto

Um lugar para cada tipo de arquivo

No layout src, o código que será importado fica dentro de src/tarefas. Já os arquivos do projeto, como pyproject.toml, README.md e testes, permanecem na raiz.

Para este exemplo, crie uma pasta de projeto chamada tarefas-cli no seu computador. O nome da distribuição poderá ser tarefas-cli, enquanto o pacote importável será tarefas.

Estrutura desejada

A árvore abaixo mostra a separação entre a raiz do projeto e o pacote Python.

Diagrama de árvore em que a raiz tarefas-cli contém pyproject.toml, README.md, src e tests; src contém tarefas; e tarefas contém __init__.py e cli.py.

Somente tarefas, dentro de src, é o pacote importável.

Dica

Não crie um segundo pacote na raiz

Evite manter outra pasta tarefas/ ao lado de src/. Duas cópias do mesmo pacote tornam fácil executar um código diferente daquele que você pretende distribuir.

Crie a CLI mínima

Arquivos do pacote

No editor, crie src/tarefas/__init__.py vazio. Em seguida, crie src/tarefas/cli.py com o conteúdo completo abaixo.

A CLI usa somente a biblioteca padrão. O import de tomllib será útil para manter a compatibilidade do projeto coerente com Python 3.11 ou superior em uma etapa posterior.

src/tarefas/cli.py

python
import argparse
import tomllib


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(
        prog="tarefas",
        description="Lista tarefas de exemplo.",
    )
    parser.add_argument(
        "--config",
        default="config.toml",
        help="caminho do arquivo de configuração",
    )
    args = parser.parse_args(argv)

    print(f"Configuração selecionada: {args.config}")
    print("Nenhuma tarefa pendente.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

Atenção

Ainda não execute como pacote

Neste momento, não use python -m tarefas: o arquivo __main__.py e a instalação do projeto serão tratados depois. Por enquanto, o objetivo é deixar os arquivos no lugar certo.

O nome importável não inclui src

src organiza; tarefas é o pacote

O diretório src não entra no nome das importações. Quando o pacote estiver configurado e instalado, o uso será import tarefas, nunca import src.tarefas.

Como a raiz do projeto não contém diretamente a pasta tarefas, executar Python nela não deve fazer o pacote aparecer por acidente. Isso obriga o desenvolvimento a usar a instalação configurada, em vez de confundir as fontes locais com o pacote instalado.

Escolha a árvore correta

Qual árvore representa o layout src para um pacote importável chamado tarefas?

Passo 3 de 8

Configurar o backend e a descoberta de pacotes

Configure o setuptools para construir o projeto e localizar o pacote tarefas dentro de src.

Backend: quem prepara a distribuição

O papel de [build-system]

O backend é o componente que lê a configuração e prepara a distribuição do projeto. Neste exemplo, usaremos o setuptools.

A tabela [build-system] declara:

  • requires: o que é necessário para executar o backend durante a construção;
  • build-backend: o objeto Python que será usado como backend.

Esses requisitos são de construção. Eles não descrevem bibliotecas exigidas para a CLI tarefas funcionar quando estiver instalada.

Backend do projeto

Adicione esta tabela ao pyproject.toml na raiz do projeto.

toml
[build-system]
requires = ["setuptools>=64"]
build-backend = "setuptools.build_meta"

Da árvore ao pacote encontrado

O diretório src não entra no import

Sua árvore contém o pacote regular tarefas dentro de src:

projeto/
├── pyproject.toml
├── README.md
└── src/
    └── tarefas/
        ├── __init__.py
        └── cli.py

O nome importável continua sendo tarefas, e não src.tarefas. Por isso, o setuptools precisa receber duas informações explícitas: src é a raiz dos pacotes e é ali que deve procurar pacotes.

Mapeamento entre configuração e arquivos

A configuração aponta para src; a descoberta encontra tarefas porque ele possui __init__.py.

Diagrama mostrando a raiz do projeto com pyproject.toml e a pasta src, contendo o pacote tarefas com os arquivos __init__.py e cli.py. Setas partem das configurações package-dir e where, ambas apontando para src, até o pacote tarefas.

package-dir e where direcionam o setuptools para a pasta que contém os pacotes importáveis.

Configuração explícita do layout src

Mapear e descobrir pacotes

Acrescente estas tabelas ao mesmo pyproject.toml, após [build-system].

toml
[tool.setuptools]
package-dir = {"" = "src"}

[tool.setuptools.packages.find]
where = ["src"]
namespaces = false

Dica

Por que namespaces = false?

Este projeto usa pacotes regulares, identificados por __init__.py, como src/tarefas/__init__.py. Com namespaces = false, a descoberta fica alinhada a essa estrutura e não procura pacotes de namespace neste exemplo.

Confira a configuração

Complete o valor

Para localizar o pacote tarefas na árvore src/tarefas/__init__.py, complete:

where = ["____"]

Passo 4 de 8

Declarar identidade e compatibilidade

Defina metadados estáticos da distribuição, conecte o README existente e declare uma versão mínima de Python coerente com o uso de tomllib.

Identidade da distribuição

Metadados em [project]

No pyproject.toml, a tabela [project] descreve a distribuição que será instalada. Comece com valores estáticos para name, version e description.

Para este projeto, a distribuição se chama tarefas-cli, enquanto o pacote que será importado continua sendo tarefas. Esses nomes podem coincidir, mas não precisam ser iguais. A version é uma string em TOML.

Distribuição e pacote têm papéis diferentes

Diagrama mostrando uma caixa de distribuição chamada tarefas-cli contendo um pacote importável chamado tarefas, com um terminal usando o comando tarefas.

name identifica a distribuição; o nome do pacote é usado nos imports.

Metadados iniciais

Adicione ou complete esta tabela no seu pyproject.toml:

toml
[project]
name = "tarefas-cli"
version = "0.1.0"
description = "Gerenciador de tarefas pela linha de comando"

README e versão mínima do Python

Referências que precisam existir

O campo readme aponta para um arquivo relativo ao diretório que contém o pyproject.toml. Portanto, ao usar readme = "README.md", crie esse arquivo na raiz do projeto.

Já requires-python informa o requisito de instalação da distribuição. Como a CLI de referência usa tomllib, disponível na biblioteca padrão a partir do Python 3.11, declare ">=3.11".

Complete [project]

Acrescente estas duas linhas à tabela [project]:

toml
readme = "README.md"
requires-python = ">=3.11"

Crie README.md na raiz

No mesmo diretório do pyproject.toml, crie o arquivo README.md com este conteúdo mínimo:

markdown
# tarefas-cli

Aplicação de linha de comando para gerenciar tarefas.

Atenção

Compatibilidade não é instalação

requires-python = ">=3.11" impede a instalação em versões anteriores incompatíveis. Ele não instala o Python 3.11 e não prova que todas as versões aceitas foram testadas.

Confira a coerência

Metadados consistentes

Qual alternativa está coerente com uma CLI que usa tomllib e possui um arquivo README.md na raiz do projeto?

Passo 5 de 8

Separar dependências de execução e desenvolvimento

Classifique requisitos do projeto para declarar somente o necessário em cada parte do pyproject.toml.

O que a aplicação precisa para funcionar

Dependências de execução

Em [project], dependencies lista bibliotecas de terceiros necessárias quando alguém usa a aplicação normalmente. Ela não é uma lista de tudo que existe no ambiente de desenvolvimento.

A CLI tarefas deste exemplo usa apenas a biblioteca padrão, inclusive tomllib. Por isso, sua lista de dependências de execução pode ficar vazia: dependencies = [].

Dois conjuntos de requisitos

Diagrama com o código da aplicação no centro; à esquerda, uma biblioteca externa conectada ao funcionamento da aplicação; à direita, ferramentas de teste, lint e tipagem conectadas apenas ao desenvolvimento.

Uma biblioteca usada pela aplicação entra em dependencies; ferramentas usadas para verificar o projeto podem formar o extra dev. A biblioteca padrão não entra em nenhuma dessas listas.

Dica

Critério prático

Pergunte: “Se uma pessoa instalar a distribuição apenas para executar a aplicação, esta biblioteca será necessária?” Se sim, ela pertence a dependencies, mesmo que também seja útil durante o desenvolvimento.

Declarar requisitos no pyproject.toml

Trechos de dependências do exemplo

Adicione estas tabelas ao pyproject.toml já iniciado nos passos anteriores.

toml
[project]
name = "tarefas-cli"
version = "0.1.0"
description = "Uma CLI simples para tarefas"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []

[project.optional-dependencies]
dev = [
    "pytest>=8",
    "ruff>=0.6",
    "mypy>=1.10",
]

Exemplo

Quando uma dependência externa aparece

Se a CLI passasse a usar uma biblioteca externa chamada httpx para fazer requisições durante sua operação normal, a declaração passaria a incluir, por exemplo:

dependencies = ["httpx>=0.27"]

O limite >=0.27 expressa a versão mínima compatível exigida pelo código. Ele deve ser justificado pelo que a aplicação usa — não copiado automaticamente das versões instaladas na sua máquina.

Atenção

Não esconda requisito de uso em dev

Uma biblioteca necessária para executar um comando da aplicação não pode ficar somente em dev. Quem instalar a distribuição sem ferramentas de desenvolvimento teria uma falha em tempo de execução.

Requisitos não são um retrato do ambiente

Por que não copiar pip freeze

A saída de pip freeze é um inventário congelado do ambiente atual: pode incluir dependências transitivas, ferramentas usadas em outros projetos e versões fixadas por motivos locais. Já dependencies descreve os requisitos diretos da distribuição.

Mantenha no pyproject.toml apenas o que o projeto declara precisar. Os extras, como dev, são conjuntos opcionais adicionais para tarefas de desenvolvimento; eles não tornam pytest, Ruff e mypy requisitos de uso normal.

Verifique a distinção

Copiar toda a saída de pip freeze para dependencies é uma forma adequada de declarar os requisitos da distribuição.

Classifique cada requisito

Destino correto

Associe cada item ao local ou tratamento mais adequado no projeto tarefas.

Toque em um item e depois no par correspondente.

Passo 6 de 8

Registrar as duas formas de iniciar a CLI

Configure o comando instalável e a execução com python -m para que ambos usem a mesma função main.

Duas entradas, uma única CLI

Um ponto central de execução

A distribuição terá duas formas de iniciar a mesma interface:

  • o comando de terminal tarefas;
  • o comando python -m tarefas.

As duas devem delegar para tarefas.cli:main. Assim, a interpretação dos argumentos, as regras da aplicação e os códigos de saída permanecem em um único lugar.

Convergência das entradas

Os dois caminhos chegam à mesma função de entrada.

Diagrama mostrando o comando tarefas e python -m tarefas convergindo para a função main no módulo tarefas.cli, que então retorna um código de saída.

Evite criar uma implementação diferente para cada forma de iniciar a CLI.

Registrar o comando instalável

A tabela [project.scripts]

No pyproject.toml, acrescente a tabela abaixo. O lado esquerdo é o nome que o usuário digitará no terminal; o lado direito é uma referência no formato módulo:função.

A referência não é um caminho de arquivo: não use src/tarefas/cli.py. Também não é uma chamada: não use parênteses em main().

pyproject.toml

Acrescente esta tabela ao arquivo, no mesmo nível de [project].

toml
[project.scripts]
tarefas = "tarefas.cli:main"

Dica

Contrato da função chamada

O instalador criará um comando que chama main() sem argumentos obrigatórios. Portanto, mantenha o parâmetro opcional já adotado pela CLI, como def main(argv: list[str] | None = None) -> int:. O inteiro retornado por main será encaminhado como código de saída do processo.

Permitir python -m tarefas

Crie __main__.py no pacote

Crie o arquivo src/tarefas/__main__.py. Ao executar python -m tarefas, o Python executará esse módulo. Ele apenas importa e chama a main existente, preservando o retorno inteiro com SystemExit.

src/tarefas/__main__.py

Este arquivo não deve repetir o parser nem as regras da aplicação.

python
from .cli import main


if __name__ == "__main__":
    raise SystemExit(main())

Exemplo

Responsabilidades separadas

src/tarefas/cli.py continua sendo o local de main(argv=None) e da implementação da CLI. Já src/tarefas/__main__.py é uma ponte curta para a execução por módulo. O comando declarado em [project.scripts] também aponta diretamente para essa mesma main.

Complete as duas referências

Destino do comando

Complete o valor da configuração:

tarefas = "____"

Delegação por módulo

Complete a linha final de src/tarefas/__main__.py:

raise ____(main())

Passo 7 de 8

Verificar a instalação editável

Instale o projeto em modo editável e confira as duas formas de iniciar a CLI durante o desenvolvimento.

Confira o projeto antes de instalar

Raiz pronta para desenvolvimento

Na raiz do projeto, confira se os arquivos referenciados existem e se o pacote está dentro de src. O nome da distribuição é tarefas-cli; o pacote importável e o comando continuam sendo tarefas.

Árvore esperada

text
tarefas-cli/
├── pyproject.toml
├── README.md
├── src/
│   └── tarefas/
│       ├── __init__.py
│       ├── __main__.py
│       └── cli.py
└── tests/                 # opcional neste momento

pyproject.toml consolidado

Antes de instalar, salve este conteúdo como pyproject.toml na raiz do projeto.

toml
[build-system]
requires = ["setuptools>=64"]
build-backend = "setuptools.build_meta"

[project]
name = "tarefas-cli"
version = "0.1.0"
description = "Uma CLI simples para organizar tarefas"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []

[project.optional-dependencies]
dev = [
    "pytest>=8",
    "ruff>=0.6",
    "mypy>=1.11",
]

[project.scripts]
tarefas = "tarefas.cli:main"

[tool.setuptools]
package-dir = {"" = "src"}

[tool.setuptools.packages.find]
where = ["src"]
namespaces = false

O que será conectado pela instalação

Diagrama com a raiz do projeto contendo pyproject.toml e README.md, o pacote tarefas dentro de src e uma ligação para um terminal com duas entradas de execução.

A configuração aponta para o pacote em src; a instalação cria a forma de chamar sua função de entrada pelo terminal.

Instale no ambiente de desenvolvimento

Execute na raiz do projeto

Com o ambiente virtual de desenvolvimento ativado e o terminal aberto na pasta que contém pyproject.toml, use o pip associado ao mesmo Python.

Instalação editável básica

shell
python -m pip install -e .

Dica

Ferramentas de desenvolvimento são opcionais

Para instalar também o extra dev, use o comando abaixo. Ele adiciona pytest, Ruff e mypy ao ambiente, mas esses pacotes não são necessários para alguém usar normalmente a CLI.

Instalação editável com o extra dev

shell
python -m pip install -e ".[dev]"

Teste as duas entradas

Mesma CLI, duas formas de iniciar

Primeiro, compare as ajudas. Elas devem expor as mesmas opções e subcomandos, pois tanto o comando instalado quanto python -m tarefas delegam para tarefas.cli:main. A linha de uso pode mostrar o nome usado para iniciar cada uma.

Verificação manual

Depois da ajuda, execute uma operação simples já disponível na sua CLI — por exemplo, listar tarefas. O resultado funcional e o código de saída devem ser equivalentes nas duas entradas.

shell
tarefas --help
python -m tarefas --help

# Exemplo de operação que não altera dados:
tarefas listar
python -m tarefas listar

Entradas convergentes

Dois terminais, um representando um comando instalado e outro representando python -m tarefas, convergem para o mesmo módulo cli e a mesma função principal.

Não duplique o tratamento de argumentos: as duas entradas devem alcançar a mesma função main.

Atenção

Ajuda não substitui uma operação

A ajuda confirma que a entrada foi encontrada e que o parser iniciou. Execute também uma operação simples da sua aplicação para observar que as duas entradas chegam às mesmas regras e ao mesmo armazenamento configurado.

Observe o efeito do modo editável

Alterações nas fontes aparecem na próxima execução

Faça uma alteração pequena em src/tarefas/cli.py, como ajustar a descrição passada ao ArgumentParser. Salve o arquivo e execute novamente tarefas --help; a nova descrição deve aparecer sem rodar outra vez a instalação. O ambiente editável está vinculado às fontes do projeto.

Atenção

Quando reinstalar

Repita python -m pip install -e . após mudar metadados, dependências ou pontos de entrada no pyproject.toml. Alterações apenas em arquivos Python existentes normalmente são percebidas na próxima execução.

Relate sua verificação

Relate sua verificação: qual comando instalou o projeto, como as duas entradas se comportaram, qual alteração de código você observou sem reinstalar e por que isso ainda não valida uma distribuição final.

Escreva pelo menos 180 caracteres (0/180).

Passo 8 de 8

Revisar a configuração como um conjunto

Revise as relações entre a árvore de arquivos, o pyproject.toml e as entradas da CLI antes de avançar para a geração de distribuições.

Revise as conexões, não só cada campo

Uma configuração coerente

Antes de considerar o projeto pronto para distribuição, confira se cada declaração no pyproject.toml corresponde a algo real no projeto. A revisão cruza quatro pontos: a árvore em src/, a descoberta de pacotes, os arquivos citados pelos metadados e o destino do comando de terminal.

Mapa de conferência

Use este fluxo para localizar incoerências: os arquivos devem sustentar as referências declaradas.

Diagrama conectando a pasta src/tarefas ao mapeamento package-dir e à descoberta de pacotes, README.md ao campo readme, e tarefas.cli:main ao comando tarefas.

Cada referência da configuração precisa apontar para um arquivo, pacote ou função que exista.

Dica

Ordem prática de revisão

Comece pelos arquivos existentes; depois confira os caminhos e nomes no TOML; por fim, execute as duas entradas da CLI após a instalação editável. Isso evita diagnosticar um comando quando o pacote ainda não foi encontrado.

Caso para diagnosticar

Projeto observado

Considere esta árvore, criada no diretório atual:

.
├── README.md
├── pyproject.toml
└── src/
    └── tarefas/
        ├── __init__.py
        ├── __main__.py
        └── cli.py

A CLI usa tomllib. Não há bibliotecas de terceiros necessárias durante a execução.

pyproject.toml com problemas

Compare cada trecho com a árvore e com o comportamento esperado.

toml
[build-system]
requires = ["setuptools>=64"]
build-backend = "setuptools.build_meta"

[project]
name = "tarefas-cli"
version = "0.1.0"
description = "Uma CLI para tarefas"
readme = "LEIA-ME.md"
requires-python = ">=3.10"
dependencies = ["tomllib"]

[project.optional-dependencies]
dev = ["pytest", "ruff", "mypy"]

[project.scripts]
tarefas = "tarefas.main:main"

[tool.setuptools]
package-dir = {"" = "src"}

[tool.setuptools.packages.find]
where = ["pacotes"]
namespaces = false

Aplique a revisão

Encontre e corrija

Liste as correções necessárias no arquivo mostrado. Inclua o caminho do README, a versão mínima de Python, a lista de dependências, o destino do comando e o diretório de descoberta.

Escreva pelo menos 120 caracteres (0/120).

Resumo

Gabarito de revisão

Uma correção coerente alinha todas as referências ao projeto observado.

  • readme = "README.md", pois o arquivo existe na raiz.
  • requires-python = ">=3.11", pois a CLI usa tomllib.
  • dependencies = []: biblioteca padrão não é dependência de terceiros.
  • tarefas = "tarefas.cli:main": módulo e função existem nesse destino.
  • where = ["src"]: a descoberta parte do diretório que contém o pacote tarefas.
  • setuptools é requisito de construção; pytest, Ruff e mypy são ferramentas opcionais de desenvolvimento.

Fechamento: pronto para a próxima etapa

O que a instalação editável comprovou

Ao executar python -m pip install -e . e testar tarefas --help e python -m tarefas --help, você verificou que as fontes atuais podem ser usadas pelo ambiente de desenvolvimento e que as duas entradas alcançam a mesma CLI. Mudanças em código Python podem aparecer em uma nova execução sem reinstalar.

Por outro lado, isso não comprova que uma distribuição final conterá todos os arquivos necessários. Essa validação será feita na próxima etapa, ao gerar e inspecionar os artefatos.

Resumo

Checklist final

Antes de seguir, confirme estes pontos no seu projeto.

  • O pacote importável está em src/tarefas/, com __init__.py.
  • package-dir e where apontam para src.
  • Os metadados têm nome, versão, descrição, README existente e compatibilidade coerente com o código.
  • As dependências de execução incluem apenas bibliotecas de terceiros necessárias no uso normal; ferramentas ficam no extra dev.
  • O comando aponta para tarefas.cli:main, e __main__.py delega para a mesma função.
  • A instalação editável e as duas formas de iniciar a CLI foram verificadas.

Configuração revisada

Parabéns! Você concluiu: Configurar uma distribuição com pyproject.toml

Muito bem! Você conectou a estrutura do projeto, os metadados, os requisitos e os pontos de entrada em uma configuração coerente. O próximo passo é gerar e inspecionar os artefatos de distribuição.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso