Как поделиться своими пакетами Python
() translation by (you can also view the original English article)
Обзор
Пакеты Python являются строительными блоками приложений Python. Они инкапсулируют некоторые согласованные функции, которые могут быть импортированы и использованы многими приложениями и системами. Но сначала разработчики должны найти ваш пакет и уметь его устанавливать. Python предоставляет бесплатный публичный репозиторий для пакетов, который является де-факто стандартом для обмена пакетами Python. Вы также можете использовать частные репозитории пакетов для собственных пакетов.
В этом уроке вы узнаете, как делиться своими собственными пакетами с сообществом. Если у вас есть проприетарные пакеты, которые вам нужно разделить только внутри вашей компании, вы узнаете, как это сделать.
Для получения дополнительной информации см. Раздел «Как использовать пакеты Python и как писать собственные пакеты Python».
Что такое PyPI?
PyPI означает Python Package Index. Это публичный репозиторий для загрузки ваших пакетов. Pip знает PyPI и может устанавливать и / или обновлять пакеты из PyPI. PyPI раньше назывался «Cheese Shop» после знаменитого эскиза Монти Пайтона. Если вы слышите, что люди ссылаются на «Сырный магазин» в контексте упаковки Python, не беспокойтесь. Это просто PyPI.
Подготовьте пакет для загрузки
Перед загрузкой пакета вам необходимо иметь пакет. Я буду использовать пакет conman, который я представил в статье «Как писать собственные пакеты Python». Поскольку PyPI содержит тысячи пакетов, очень важно правильно описать ваш пакет, если вы хотите, чтобы люди его нашли. PyPI поддерживает впечатляющий набор тегов метаданных, чтобы люди могли найти нужный пакет для работы.
Файл setup.py содержит много важной информации, используемой для установки вашего пакета. Но он также может включать метаданные, используемые для классификации вашего пакета в PyPI. Пакеты классифицируются с использованием нескольких тегов метаданных. Некоторые из них являются текстовыми, а некоторые из них имеют список возможных значений. Полный список доступен на странице списка классификаторов PyPI.
Давайте добавим несколько классификаторов в setup.py
. Нет необходимости увеличивать номер версии, поскольку это только метаданные, и код остается неизменным:
1 |
from setuptools import setup, find_packages |
2 |
|
3 |
|
4 |
|
5 |
setup(name='conman', |
6 |
|
7 |
version='0.3', |
8 |
|
9 |
url='https://github.com/the-gigi/conman', |
10 |
|
11 |
license='MIT', |
12 |
|
13 |
author='Gigi Sayfan', |
14 |
|
15 |
author_email='the.gigi@gmail.com', |
16 |
|
17 |
description='Manage configuration files', |
18 |
|
19 |
classifiers=[ |
20 |
|
21 |
'Development Status :: 3 - Alpha', |
22 |
|
23 |
'Intended Audience :: Developers', |
24 |
|
25 |
'Topic :: Software Development :: Libraries', |
26 |
|
27 |
'License :: OSI Approved :: MIT License', |
28 |
|
29 |
'Programming Language :: Python :: 2', |
30 |
|
31 |
'Programming Language :: Python :: 2.6', |
32 |
|
33 |
'Programming Language :: Python :: 2.7', |
34 |
|
35 |
],
|
36 |
|
37 |
packages=find_packages(exclude=['tests']), |
38 |
|
39 |
long_description=open('README.md').read(), |
40 |
|
41 |
zip_safe=False, |
42 |
|
43 |
setup_requires=['nose>=1.0'], |
44 |
|
45 |
test_suite='nose.collector') |
Заводим аккаунт
Вам нужно создать учетную запись в PyPI, чтобы иметь возможность загружать пакеты. Заполните эту форму и подтвердите свою личность, нажав на URL-адрес в электронном письме с подтверждением. Теперь вам нужно создать файл .pypyrc
в вашем домашнем каталоге, который будет содержать информацию, необходимую для загрузки пакетов.
1 |
[distutils] |
2 |
|
3 |
index-servers=pypi |
4 |
|
5 |
|
6 |
|
7 |
[pypi] |
8 |
|
9 |
repository = https://pypi.python.org/pypi |
10 |
|
11 |
username = the_gigi |
12 |
Вы также можете добавить свой пароль, но это не безопасно в случае, если какой-нибудь плохой элемент завладеет вашим ноутбуком. Это особенно важно, если вы загружаете популярные пакеты, потому что, если кто-то может загружать или обновлять ваши пакеты, все люди, которые используют эти пакеты, будут уязвимы.
Тестирование
Если вы хотите протестировать процесс регистрации и загрузки пакетов и не беспокоиться о публикации чего-то неполного, вы можете работать с альтернативным сайтом тестирования PyPI. Расширьте файл ~/.pypirc, чтобы включить раздел «pypitest».
1 |
[distutils] |
2 |
|
3 |
index-servers= |
4 |
|
5 |
pypi |
6 |
|
7 |
pypitest |
8 |
|
9 |
|
10 |
|
11 |
[pypitest] |
12 |
|
13 |
repository = https://testpypi.python.org/pypi |
14 |
|
15 |
username = the_gigi |
16 |
|
17 |
|
18 |
|
19 |
[pypi] |
20 |
|
21 |
repository = https://pypi.python.org/pypi |
22 |
|
23 |
username = the_gigi |
24 |
Помните, что тестовый сайт регулярно очищается, поэтому не полагайтесь на него. Он предназначен только для тестирования.
Зарегистрируйте свой пакет
Если это первый релиз вашего пакета, вам необходимо зарегистрировать его с помощью PyPI. Twine имеет команду регистрации, но я не могу понять, как ее использовать. Если следовать документации, то возникает ошибка, и при проверке модульных тестов на twine нет теста для команды register. Ну что ж. Вы можете сделать это вручную, используя эту форму, чтобы загрузить файл PKG-INFO. Если вы используете Python 2.7.9+ или Python 3.2+, вы также можете безопасно зарегистрироваться с помощью setup.py register
.
Давайте зарегистрируем conman на тестовом сайте PyPI. Обратите внимание на -r pypitest
, который на основе раздела в ~/.pypirc
будет регистрироваться на тестовом сайте.
1 |
python setup.py register -r pypitest
|
2 |
|
3 |
running register |
4 |
|
5 |
running egg_info |
6 |
|
7 |
writing conman.egg-info/PKG-INFO |
8 |
|
9 |
writing top-level names to conman.egg-info/top_level.txt |
10 |
|
11 |
writing dependency_links to conman.egg-info/dependency_links.txt |
12 |
|
13 |
reading manifest file 'conman.egg-info/SOURCES.txt'
|
14 |
|
15 |
reading manifest template 'MANIFEST.in'
|
16 |
|
17 |
writing manifest file 'conman.egg-info/SOURCES.txt'
|
18 |
|
19 |
running check |
20 |
|
21 |
Password: |
22 |
|
23 |
Registering conman to https://testpypi.python.org/pypi |
24 |
|
25 |
Server response (200): OK |
Twine
Вы можете загрузить пакет с помощью python setup.py upload
, но он небезопасен, поскольку он использовался для отправки вашего имени пользователя и пароля через HTTP до Python 2.7.9 и Python 3.2. Twine всегда использует HTTPS и имеет дополнительные преимущества, такие как загрузка предварительно созданных дистрибутивов и поддерживает любой формат упаковки, включая wheels. Я буду использовать twine для фактической загрузки.
Twine не входит в стандартную библиотеку, поэтому вам нужно установить его: pip install twine
.
Загрузите свой пакет
Наконец, пришло время фактически загрузить пакет.
1 |
> twine upload -r pypitest -p ******* dist/* |
2 |
|
3 |
Uploading distributions to https://testpypi.python.org/pypi |
4 |
|
5 |
Uploading conman-0.3-py2-none-any.whl |
6 |
|
7 |
Uploading conman-0.3-py2.py3-none-any.whl |
8 |
|
9 |
Uploading conman-0.3.tar.gz |
Twine загрузил все форматы распространения, как источник, так и wheels.



Проверьте свой пакет
Как только ваш пакет находится на PyPI, вы должны убедиться, что его можно установить, и все работает. Здесь я создаю одноразовую виртуальную среду, pip install conman из сайта тестирования PyPI, а затем импортирую ее. Возможно, вам захочется провести более тщательные тесты для вашего пакета.
1 |
> mkvirtualenv test_conman_pypi
|
2 |
|
3 |
New python executable in test_conman_pypi/bin/python2.7
|
4 |
|
5 |
Also creating executable in test_conman_pypi/bin/python
|
6 |
|
7 |
Installing setuptools, pip...done. |
8 |
|
9 |
Usage: source deactivate
|
10 |
|
11 |
|
12 |
|
13 |
removes the 'bin' directory of the environment activated with 'source |
14 |
|
15 |
activate' from PATH.
|
16 |
|
17 |
(test_conman_pypi) > pip install -i https://testpypi.python.org/pypi conman |
18 |
|
19 |
Downloading/unpacking conman |
20 |
|
21 |
Downloading conman-0.3-py2-none-any.whl |
22 |
|
23 |
Storing download in cache at /Users/gigi/.cache/pip/https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl
|
24 |
|
25 |
Installing collected packages: conman |
26 |
|
27 |
Successfully installed conman |
28 |
|
29 |
Cleaning up... |
30 |
|
31 |
(test_conman_pypi) > python |
32 |
|
33 |
Python 2.7.10 (default, Jun 10 2015, 19:43:32) |
34 |
|
35 |
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin |
36 |
|
37 |
Type "help", "copyright", "credits" or "license" for more information. |
38 |
|
39 |
>>> import conman
|
40 |
|
41 |
>>>
|
Обратите внимание, что распределение wheel было установлено по умолчанию.
Версионирование
Когда вы разрабатываете свои пакеты и загружаете новые версии, важно следовать разумной схеме управления версиями. Люди будут очень расстроены, если непреднамеренное обновление нарушит их код. Ваша схема управления версиями должна соответствовать PEP-440 - Идентификация версии и спецификация зависимостей.
Эта спецификация позволяет выбирать несколько схем. Я рекомендую использовать популярную схему Semantic Versioning. Это в значительной степени "<major>.<minor>.<patch>", что соответствует PEP-440 "<major>.<minor>.<micro>". Просто остерегайтесь версий, продолжающих знаки дефиса или плюса, которые несовместимы с PEP-440.
Репозитории частных пакетов
PyPI отличный инструмент, но иногда вы не хотите делиться своими пакетами. Многие компании и организации имеют инженерные команды, которые используют Python и должны обмениваться пакетами между ними, но не могут публично публиковать их на PyPI. Это не является проблемой. Вы можете обмениваться пакетами в частных репозиториях пакетов под вашим контролем.
Обратите внимание, что иногда вам может понадобиться иметь закрытый репозиторий пакетов под вашим контролем, чтобы управлять зависимостями сторонних разработчиков. Например, автор пакета может решить удалить пакет из PyPI. Если ваша система полагается на возможность установки этого пакета из PyPI, у вас проблемы.
Devpi
Devpi (который обозначает Development Package Index) является заменой для публичного сервера PyPI. Это лицензия MIT, поэтому вы можете запустить его в своем брандмауэре. Devpi очень мощный и имеет множество функций, которые позволяют ему функционировать как ваш полноценный сервер пакетов:
- Быстрое зеркало PyPI
- Загрузка, тестирование и создание с частными индексами
- Наследование индексов
- Веб-интерфейс и поиск
- Копирование
- Импорт / Экспорт
- Интеграция Дженкинса
Devpi имеет отличную документацию, систему плагинов и активно развивается энергичным сообществом.
Заключение
Python предоставляет полное решение для размещения ваших пакетов и предоставления их вашим коллегам Pythonistas. Существует оптимизированный процесс, в котором помогают инструменты для упаковки и загрузки пакетов и упрощения их поиска и установки.
Если вам нужно сохранять конфиденциальность, Devpi - это то что вам нужно.