|
| 1 | +Title: Como distribuir sua aplicação Python com PyPI |
| 2 | +Slug: como-distribuir-sua-aplicacao-python-com-pypi |
| 3 | +Date: 2016-06-17 13:47:24 |
| 4 | +Category: Python |
| 5 | +Tags: python, pypi, tutorial, desenvolvimento, pypi, pip |
| 6 | +Author: Michell Stuttgart |
| 7 | +Email: michellstut@gmail.com |
| 8 | +Github: mstuttgart |
| 9 | +Linkedin: michellstut |
| 10 | +Facebook: michell.stuttgart |
| 11 | +Site: http://codigoavulso.com.br |
| 12 | + |
| 13 | +Imagine a seguinte situação: você passou alguns dias (ou mesmo meses) desenvolvendo uma módulo python, escreveu testes, implementou funcionalidades e depois de alguns ajustes, chegou a hora de liberar seu software para que outros desenvolvedores possam utilizá-lo. Qual o melhor modo de distribuí-lo? |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +Caro leitor, se você costuma programar em Python (seja profissionalmente ou não) provavelmente já instalou outros módulos usando o [PyPI](https://pypi.python.org/pypi), através do comando abaixo: |
| 18 | + |
| 19 | +```bash |
| 20 | +pip install nomedomodulo |
| 21 | +``` |
| 22 | + |
| 23 | +Não seria interessante usar o mesmo método para distribuir a sua aplicação? Sim? Então mãos a obra. |
| 24 | + |
| 25 | +### Sobre o PyPI - Python Package Index |
| 26 | + |
| 27 | +O site [PyPI](https://pypi.python.org/pypi), é um repositório de *softwares* desenvolvidos na linguagem Python. Em outras palavras, ele garante que seu pacote Python sempre esteja disponível para a instalação. O seu funcionamente é simples, porém algumas configurações inicias devem ser feitas para que tudo funcione corretamente. |
| 28 | + |
| 29 | +### Crie uma conta |
| 30 | + |
| 31 | +Primeiramente, para distribuir seus pacotes usando o [PyPI](https://pypi.python.org/pypi), precisamos criar uma conta em ambos os sites: |
| 32 | + |
| 33 | +* [PyPI Live](https://pypi.python.org/pypi?%3Aaction=register_form) |
| 34 | +* [PyPI Test](https://testpypi.python.org/pypi?%3Aaction=register_form) |
| 35 | + |
| 36 | +Recomendo que você utilize o mesmo email e senha para ambos os sites. Posteriormente, isso tornará mais fácil o processo de configuração. |
| 37 | + |
| 38 | +### Configurando o ambiente |
| 39 | + |
| 40 | +O próximo passo é criar um arquivo `.pypirc` em sua `home`. Esse arquivo contem informações de auteticação, tanto para o [PyPI Live](https://pypi.python.org/pypi) quando para o [PyPI Test](https://testpypi.python.org/pypi). |
| 41 | + |
| 42 | +```bash |
| 43 | +touch ~/.pypirc |
| 44 | +``` |
| 45 | + |
| 46 | +Apesar de não ser obrigatório a criação desse aquivo, ele facilita muito nosso trabalho, uma vez que você não precisaremos inserir nosso email e senha toda vez que formos enviar nosso código para o [PyPI Live](https://pypi.python.org/pypi). |
| 47 | + |
| 48 | +Abra o arquivo `.pypirc` em seu editor de texto favorito, e insira as informações abaixo. |
| 49 | + |
| 50 | +```bash |
| 51 | +[distutils] |
| 52 | +index-servers = |
| 53 | + pypi |
| 54 | + pypitest |
| 55 | + |
| 56 | +[pypi] |
| 57 | +repository=https://pypi.python.org/pypi |
| 58 | +username=seu_nomedeusuario |
| 59 | +password=sua_senha |
| 60 | + |
| 61 | +[pypitest] |
| 62 | +repository=https://testpypi.python.org/pypi |
| 63 | +username=seu_nomedeusuario |
| 64 | +password=sua_senha |
| 65 | + |
| 66 | +``` |
| 67 | +Em *username* insira seu nome de usuário e *password*, insira sua senha. Faça isso tanto para o `pypi` quanto para o `pypitest`. |
| 68 | + |
| 69 | +Um observação importante é que, caso a sua senha possua espaço, não a coloque entre aspas. Por exemplo, se a sua senha for "batuque da viola doida", coloque exatamente o mesmo texto em *password*. |
| 70 | + |
| 71 | + |
| 72 | +```bash |
| 73 | +password=batuque da viola doida |
| 74 | +``` |
| 75 | + |
| 76 | +### Preparando o seu módulo Python |
| 77 | + |
| 78 | +Todo pacote distribuído pelo [PyPI](https://pypi.python.org/pypi) precisa ter uma arquivo `setup.py` em seu diretório raiz. E se seu projeto também usa um arquivo *readme* em *markdown* (normalmente chamado `README.md`) você também precisará criar um arquivo chamado `setup.cfg`no diretório raiz do módulo. |
| 79 | + |
| 80 | +Como exemplo, iremos utilizar o módulo [codigo_avulso_test_tutorial](https://github.com/mstuttgart/codigo-avulso-test-tutorial) que criei para ser utilizado como exemplo em nossos tutoriais. Assim, temos a seguinte estrutura básica de diretórios: |
| 81 | + |
| 82 | +```bash |
| 83 | +. |
| 84 | +├── codigo_avulso_test_tutorial |
| 85 | +│ ├── circulo.py |
| 86 | +│ ├── figura_geometrica.py |
| 87 | +│ ├── __init__.py |
| 88 | +│ └── quadrado.py |
| 89 | +├── LICENSE |
| 90 | +├── README.md |
| 91 | +├── setup.cfg |
| 92 | +├── setup.py |
| 93 | +└── test |
| 94 | + ├── circulo_test.py |
| 95 | + ├── figura_geometrica_test.py |
| 96 | + ├── __init__.py |
| 97 | + └── quadrado_test.py |
| 98 | + |
| 99 | +``` |
| 100 | +Aqui, o que nos interessa são os arquivos `setup.py` e `setup.cfg`. Dentro do arquivo `setup.py` temos várias informações sobre nossa aplicação que serão usadas pelo [PyPI](https://pypi.python.org/pypi). |
| 101 | + |
| 102 | +```python |
| 103 | +# -*- coding: utf-8 -*- |
| 104 | +from setuptools import setup |
| 105 | + |
| 106 | +setup( |
| 107 | + name='codigo-avulso-test-tutorial', |
| 108 | + version='0.1.1', |
| 109 | + url='https://github.com/mstuttgart/codigo-avulso-test-tutorial', |
| 110 | + license='MIT License', |
| 111 | + author='Michell Stuttgart', |
| 112 | + author_email='michellstut@gmail.com', |
| 113 | + keywords='tutorial test unittest codigoavulso', |
| 114 | + description=u'Tutorial de teste unitário em Python para o blog Código Avulso', |
| 115 | + packages=['codigo_avulso_test_tutorial'], |
| 116 | + install_requires=[], |
| 117 | +) |
| 118 | +``` |
| 119 | +O nome de cada *tag* é autoexplicativo, então não vou entrar em detalhes. Basta você usar o código acima e substituir com os dados do seu pacote. |
| 120 | + |
| 121 | +O próximo passo é adicionar o seguinte conteúdo no arquivo `setup.cfg` (caso você o tenha criado). |
| 122 | + |
| 123 | +```bash |
| 124 | +[metadata] |
| 125 | +description-file = README.md |
| 126 | +``` |
| 127 | +Esse arquivo irá dizer ao [PyPI](https://pypi.python.org/pypi) onde seu arquivo *readme* está. |
| 128 | + |
| 129 | +### Publicando sua aplicação Python |
| 130 | + |
| 131 | +Agora iremos estudar os passos para enviar nossa aplicação para [PyPI](https://pypi.python.org/pypi), para que ela fique disponível para ser instalada através do `pip`. |
| 132 | + |
| 133 | +#### Enviando para PyPI Test |
| 134 | + |
| 135 | +Primeiramente, vamos registrar nossa aplicação no [PyPI Test](https://testpypi.python.org/pypi). Esse passo serve para verificarmos se está tudo certo com nosso pacote e também validar se já não existe outro módulo com o mesmo nome. |
| 136 | +Registramos nossa aplicação com o seguinte comando: |
| 137 | + |
| 138 | +```bash |
| 139 | +python setup.py register -r pypitest |
| 140 | +``` |
| 141 | + |
| 142 | +Se tudo ocorrer bem teremos a seguinte saída (Server responde 200): |
| 143 | + |
| 144 | +```bash |
| 145 | +running register |
| 146 | +running egg_info |
| 147 | +creating codigo_avulso_test_tutorial.egg-info |
| 148 | +writing codigo_avulso_test_tutorial.egg-info/PKG-INFO |
| 149 | +writing top-level names to codigo_avulso_test_tutorial.egg-info/top_level.txt |
| 150 | +writing dependency_links to codigo_avulso_test_tutorial.egg-info/dependency_links.txt |
| 151 | +writing manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt' |
| 152 | +reading manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt' |
| 153 | +writing manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt' |
| 154 | +running check |
| 155 | +Registering codigo-avulso-test-tutorial to https://testpypi.python.org/pypi |
| 156 | +Server response (200): OK |
| 157 | +``` |
| 158 | +Caso exista outro pacote com o mesmo nome, teríamos de escolher outro nome para o nosso pacote. Agora com nosso pacote devidamente registrado, executamos o comando abaixo para que o pacote seja enviado para o [PyPI Test](https://testpypi.python.org/pypi). |
| 159 | + |
| 160 | +```bash |
| 161 | +python setup.py sdist upload -r pypitest |
| 162 | +``` |
| 163 | + |
| 164 | +Se tudo ocorrer bem (Server responde 200), você verá uma saída semelhante a esta e já poderá ver sua aplicação na lista do [PyPI Test](https://testpypi.python.org/pypi). |
| 165 | + |
| 166 | +```bash |
| 167 | +running sdist |
| 168 | +running egg_info |
| 169 | +writing codigo_avulso_test_tutorial.egg-info/PKG-INFO |
| 170 | +writing top-level names to codigo_avulso_test_tutorial.egg-info/top_level.txt |
| 171 | +writing dependency_links to codigo_avulso_test_tutorial.egg-info/dependency_links.txt |
| 172 | +reading manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt' |
| 173 | +writing manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt' |
| 174 | +warning: sdist: standard file not found: should have one of README, README.rst, README.txt |
| 175 | + |
| 176 | +. |
| 177 | +. |
| 178 | +. |
| 179 | + |
| 180 | +creating dist |
| 181 | +Creating tar archive |
| 182 | +removing 'codigo-avulso-test-tutorial-0.1.1' (and everything under it) |
| 183 | +running upload |
| 184 | +Submitting dist/codigo-avulso-test-tutorial-0.1.1.tar.gz to https://testpypi.python.org/pypi |
| 185 | +Server response (200): OK |
| 186 | + |
| 187 | +``` |
| 188 | + |
| 189 | +#### Enviando para PyPI Live |
| 190 | + |
| 191 | +Agora é pra valer. Executamos o mesmo passos para o [PyPI Test](https://testpypi.python.org/pypi). |
| 192 | + |
| 193 | +```bash |
| 194 | +python setup.py register -r pypi |
| 195 | +``` |
| 196 | + |
| 197 | +Tudo ocorrendo bem, enviamos nosso pacote: |
| 198 | + |
| 199 | +```bash |
| 200 | +python setup.py sdist upload -r pypi |
| 201 | +``` |
| 202 | + |
| 203 | +Parabéns! Com esse ultimo passo, publicamos o nosso pacote Python com sucesso! Agora ele pode ser [visualizado na lista de aplicações](https://pypi.python.org/pypi/codigo-avulso-test-tutorial/0.1.1) do [PyPI](https://pypi.python.org/pypi) e ser instalado usando `pip`. |
| 204 | + |
| 205 | +```bash |
| 206 | +pip install nomedopacote |
| 207 | +``` |
| 208 | + |
| 209 | +Ou, para o nosso exemplo: |
| 210 | + |
| 211 | +```bash |
| 212 | +pip install codigo_avulso_test_tutorial |
| 213 | +``` |
| 214 | + |
| 215 | +### Conclusão |
| 216 | + |
| 217 | +É isso pessoal. Neste tutorial vimos como distribuir nossa aplicação Python, desde a crição na conta no [PyPI](https://pypi.python.org/pypi) até o registro e *upload* da nossa aplicação. Espero que tenham gostado e caso tenham alguma dúvida, deixem um comentário. |
| 218 | + |
| 219 | +Obrigado pela leitura e até o próximo tutorial. |
| 220 | + |
| 221 | +### Referências |
| 222 | + |
| 223 | +* [Documentação oficial](https://wiki.python.org/moin/CheeseShopTutorial#Submitting_Packages_to_the_Package_Index) |
| 224 | +* [How to Host your Python Package on PyPI with GitHub](https://www.codementor.io/python/tutorial/host-your-python-package-using-github-on-pypi) |
| 225 | +* [How to submit a package to PyPI](http://peterdowns.com/posts/first-time-with-pypi.html) |
0 commit comments