05 - Distribuição de Software
Nesta aula complementaremos as últimas discussões criando um pequeno pacote Python instalável via pip
. Com isto chegamos mais perto de um projeto que esteja preparado para que outras pessoas o utilizem e colaborem em seu desenvolvimento.
Distribuindo software para desenvolvedores: pacote Python básico
Nosso módulo se chamará dev_aberto
e disponibilizará um programa executável hello.py
. Crie a seguinte estrutura de pastas para nosso pacote.
Important
Baixe os arquivos que usaremos neste link
pacote_exemplo/
dev_aberto/
__init__.py
dev_aberto.py
scripts/
hello.py
README.md
LICENSE
Exercise
com a estrutura acima, qual seria o import
a ser feito para usar a função hello
do arquivo dev_aberto.py?
Exercise
Pesquise para que serve o arquivo __init__.py
e use-o para permitir importar hello
usando somente import dev_aberto
.
Exercise
Crie um projeto no github para esta atividade. Faça um primeiro commit nele com o conteúdo "zerado" do projeto.
- Um arquivo README contendo uma frase de descrição do pacote e um link para o repositório da disciplina.
- Um arquivo LICENSE com a licença MIT.
O arquivo setup.py
A descrição de um pacote Python é feita usando um arquivo setup.py Veja abaixo uma versão inicial deste arquivo:
from setuptools import setup
setup(name='dev_aberto_seunome',
version='0.1',
packages=['dev_aberto']
)
Exercise
Crie o arquivo acima no seu projeto, substituindo seunome por .... seu nome. Instale o seu próprio pacote usando
pip install .
Exercise
Em outra pasta, abra um console Python e tente importar seu módulo.
Exercise
Pesquise quais argumentos são usados para especificar o autor do pacote, as versões de Python e sistemas operacionais suportados. Preencha estes valores com suas informações. Note que o pip
leva estas informações em conta e só instalará um pacote se ele estiver em um ambiente suportado.
Dependências
Para adicionar pacotes que são automaticamente instalados quando instalamos nosso pacote precisamos identificá-los no nosso arquivo setup.py. Para adicionar uma dependência de instalação basta adicionar o seguinte argumento:
...
install_requires=[
'pacote>=1.0',
'pacote2'
],
...
Exercise
Verifique as dependências do código e adicione-as no setup.py
.
requirements.txt
Muitos softwares usam também um arquivo requirements.txt para listar todas as dependências do software de modo a obter uma instalação idêntica à do desenvolvedor. Isto é importante para uniformizar os ambientes de desenvolvimento. Ou seja, este arquivo nunca será usado por usuários finais.
Exercise
Crie um requirements.txt para seu projeto com as mesmas dependências listadas no seu setup.py.
Scripts executáveis
Além de instalar o nosso módulo para uso via import
desejamos também disponibilizar o arquivo hello.py como um executável para todo o sistema. Isto pode ser feito adicionando a seguinte linha no nosso setup.py indicando que scripts/hello.py deverá ser instalado como um executável.
...
scripts=['scripts/hello.py'],
...
Não se esqueça de adicionar a seguinte linha no topo de seu arquivo para que ele possa ser executado diretamente do shell:
#!/usr/bin/env python3
No Windows é criado um executável que chama nosso script, de modo que as chamadas do executável continuarão funcionando normalmente. Note que isto não cria menus em nenhum tipo de interface gráfica.
Criando arquivos de distribuição
Dois tipos de arquivos de distribuição podem ser usados:
- sdist: é um arquivo contendo os fontes do projeto, incluindo arquivos adicionais especificados usando o argumento
data_files
. Usado se seu projeto for Python-puro. - wheel: é um formato pré-compilado e específico para cada plataforma. Mais usado quando o projeto contém extensões em C.
A criação de um arquivo de distribuição de fontes é bem simples:
A instalação deste pacote pode ser feita via pip
.
Envio para o PyPI
Vamos agora enviar nosso pacote para o Python Package Index para que ele possa ser instalado diretamente via pip
. Para não poluir o repositório com pacotes temporários e de teste, podemos usar o TestPyPI. Toda sua infraestrutura é igual ao oficial, mas ele é limpo de maneira regular.
Visite https://test.pypi.org/account/register/ e registre-se no TestPyPI.
Após o registro, usaremos o pacote twine (instalável via pip) para fazer o upload:
Você poderá, então, instalar seu pacote a partir do test PyPI usando o seguinte comando:
Entrega
Faça a entrega de sua atividade adicionando a skill Pacote Python e inclua nela a url do seu repositório no github.
Objetivo: Primeira experiência distribuindo software Python.
"skill_id": 6, "metadata": {"url": "repo-seu-pacote"}
Distribuindo software para usuários finais
Vamos agora trabalhar (em duplas) no Servidor de Desafios novamente. Seu trabalho será criar um Dockerfile
que roda o software de maneira "completa". Ou seja, o script de criação do container deverá
- instalar todas as dependências do sistema
- criar a base de dados, se necessário
- adicionar os usuários presentes no arquivo
users.csv
, se necessário - executar o servidor e serví-lo na porta
8080
dohost
- manter os dados adicionados ao reiniciar o container
Entrega
Faça a entrega de sua atividade adicionando a skill Dockerfile segundo o modelo abaixo.
Objetivo: Criou deploy automatizado para sistema web Python
"skill_id": 7, "metadata": {"url": "repo-servidor-de-desafios", "group": ["login1", "login2"]}
Referências
Algumas referências que podem ser úteis: