Como publicar seu pacote no pypi

Preparando o ambiente

Seu pacote no Github

Não é obrigatório, mas é recomendado que você tenha um repositório no Github para o seu pacote. Isso facilita a vida de quem quer contribuir com o seu projeto, e também permite crie uma página para o seu pacote, com instruções de instalação, documentação, etc. Além de criar um workflow para atualizar o pacote no pypi automaticamente quando você fizer um push para o repositório.

Instalando o setuptools, twine e wheel

Os pacotes setuptools, twine e wheel são necessários para criar e publicar o seu pacote.

Para instalar, basta executar os comandos abaixo:

pip install setuptools twine wheel

Arquivo setup.py

Para criar o pacote, você precisa criar um arquivo setup.py na raiz do seu projeto. Esse arquivo deve conter as informações do seu pacote, como nome, versão, descrição, etc. Abaixo um exemplo de setup.py:

from setuptools import setup, find_packages

setup(
    name='seupacote',
    packages=find_packages(),
    version='1.0.0',
    description='Uma descrição do seu pacote',
    long_description=open('README.md').read(),
    long_description_content_type="text/markdown",
    author='Guilherme Saldanha',
    author_email='[email protected]',
    url='https://github.com/guisaldanha/dialoger',
    license='MIT',
    keywords=['dev', 'web'],
    classifiers=[
        'Intended Audience :: Developers',
        'License :: Freely Distributable',
        'Operating System :: Microsoft :: Windows',
        'Operating System :: Unix',
        'Programming Language :: Python :: 3.11',
        'Topic :: Communications',
        'Topic :: Utilities',
    ],
    'package_data': {
        'seupacote': ['data/*.dat'],
    }
)

Criando o pacote

Para criar o pacote, basta executar o comando abaixo:

py setup.py sdist bdist_wheel

Esse comando vai criar uma pasta dist na raiz do seu projeto, com o seu pacote. Dentro dessa pasta, você vai encontrar dois arquivos, um com a extensão .tar.gz e outro com a extensão .whl. O arquivo .tar.gz é o seu pacote, e o arquivo .whl é um pacote que pode ser instalado em qualquer sistema operacional.

Publicando o pacote

Para publicar o pacote, você precisa criar uma conta no pypi. Depois de criar a conta e ter seu pacote pronto, basta executar o comando abaixo:

twine upload dist/*

Ao executar esse comando será solicitado o seu usuário e senha do pypi. Depois de informar os dados, o seu pacote será publicado no pypi.

Instalando o pacote

Para instalar o pacote, basta executar o comando abaixo:

pip install seupacote

Atualizando o pacote

Para atualizar o pacote, basta alterar a versão no arquivo setup.py e executar os comandos abaixo:

py setup.py sdist bdist_wheel
twine upload dist/*

Automatizando o processo

Para automatizar o processo de atualização do pacote e criação de release a partir das tags, você pode criar um workflow no Github. Para isso, basta criar um arquivo .github/workflows/pypi.yml no seu repositório, com o conteúdo abaixo:

Para que o workflow funcione é ncessário que você crie um token no pypi, e adicione esse token como secret no seu repositório, com o nome PYPI_TOKEN. Para criar o token, basta acessar o pypi, fazer login, e acessar a página https://pypi.org/manage/account/token/.

Você pode informar os chaves secrets em Settings / Secrets and variables / Actions.

O workflow é dividido em duas partes, a primeira parte é responsável por criar o release a partir da tag, e a segunda parte é responsável por publicar o pacote no pypi.

on:
  push:
    tags:
      - '*'

name: Create Release From Tags

jobs:
  build:
    name: Create Release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@master
      - name: Create Release
        id: create_release
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
        with:
          tag_name: ${{ github.ref }}
          release_name: ${{ github.ref }}
          body: |
            To see the changes in this version, see the CHANGELOG.md file.
          draft: false
          prerelease: false
  publish:
      name: Publish Release on PyPI
      runs-on: ubuntu-latest
      needs: build
      steps:
        - name: Checkout code
          uses: actions/checkout@master
        - name: Set up Python 3.11
          uses: actions/setup-python@v1
          with:
            python-version: 3.11
        - name: Install dependencies
          run: |
            python3 -m pip install --upgrade pip
            pip install setuptools wheel twine
        - name: Build and publish
          env:
            TWINE_USERNAME: __token__
            TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
          run: |
            python3 setup.py sdist bdist_wheel
            twine upload dist/*