Как поделиться своими пакетами Python

9 января 2018

Обзор

Пакеты Python являются строительными блоками приложений Python. Они инкапсулируют некоторые согласованные функции, которые могут быть импортированы и использованы многими приложениями и системами. Но сначала разработчики должны найти ваш пакет и уметь его устанавливать. Python предоставляет бесплатный публичный репозиторий для пакетов, который является де-факто стандартом для обмена пакетами Python. Вы также можете использовать частные репозитории пакетов для собственных пакетов.

В этом уроке вы узнаете, как делиться своими собственными пакетами с сообществом. Если у вас есть проприетарные пакеты, которые вам нужно разделить только внутри вашей компании, вы узнаете, как это сделать.

Для получения дополнительной информации см. Раздел «Как использовать пакеты Python и как писать собственные пакеты Python».

Что такое PyPI?

PyPI обозначает индекс пакета Python. Это публичный репозиторий для загрузки ваших пакетов. Pip знает PyPI и может устанавливать и / или обновлять пакеты из PyPI. PyPI раньше назывался «Cheese Shop» после знаменитого эскиза Монти Пайтона. Если вы слышите, что люди ссылаются на «Сырный магазин» в контексте упаковки Python, не беспокойтесь. Это просто PyPI.

Подготовьте пакет для загрузки

Перед загрузкой пакета вам необходимо иметь пакет. Я буду использовать пакет conman, который я представил в статье «Как писать собственные пакеты Python». Поскольку PyPI содержит тысячи пакетов, очень важно правильно описать ваш пакет, если вы хотите, чтобы люди его находили. PyPI поддерживает впечатляющий набор тегов метаданных, чтобы люди могли найти нужный пакет для работы.

В файле setup.py содержится много важной информации, используемой для установки вашего пакета. Но он также может включать метаданные, используемые для классификации вашего пакета в PyPI. Пакеты классифицируются с использованием нескольких тегов метаданных. Некоторые из них являются текстовыми, а некоторые из них имеют список возможных значений. Полный список доступен на странице списка классификаторов PyPI.

Давайте добавим несколько классификаторов в setup.py. Нет необходимости увеличивать номер версии, поскольку это только метаданные, и код остается неизменным:

from setuptools import setup, find_packages
setup(name='conman',
      version='0.3',
      url='https://github.com/the-gigi/conma',
      license='MIT',
      author='Gigi Sayfan',
      author_email='the.gigi@gmail.com',
      description='Manage configuration files',
      classifiers=[
          'Development Status :: 3 - Alpha',
          'Intended Audience :: Developers',
          'Topic :: Software Development :: Libraries',
          'License :: OSI Approved :: MIT License',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.6',
          'Programming Language :: Python :: 2.7',
      ],
      packages=find_packages(exclude=['tests']),
      long_description=open('README.md').read(),
      zip_safe=False,
      setup_requires=['nose>=1.0'],
      test_suite='nose.collector')

Создание учетной записи

Вам необходимо создать учетную запись в PyPI для загрузки пакетов. Заполните эту форму и подтвердите свою личность, нажав на URL-адрес в электронном письме с подтверждением. Теперь вам нужно создать файл.pypyrc в вашем домашнем каталоге, который будет содержать информацию, необходимую для загрузки пакетов.

[distutils]
index-servers=pypi
[pypi]
repository = https://pypi.python.org/pypi
username = the_gigi

Вы также можете добавить свой пароль, но это безопаснее, если вы не в случае, если какой-нибудь плохой элемент завладеет вашим ноутбуком. Это особенно важно, если вы загружаете популярные пакеты, потому что, если кто-то может загружать или обновлять ваши пакеты, все люди, которые используют эти пакеты, будут уязвимы.

Тестирование

Если вы хотите протестировать процесс регистрации и загрузки пакетов и не беспокоиться о публикации чего-то неполного, вы можете работать с альтернативным сайтом тестирования PyPI. Расширьте свой файл ~.pypirc, чтобы включить раздел «pypitest».

[distutils]
index-servers=
    pypi
    pypitest
[pypitest]
repository = https://testpypi.python.org/pypi
username = the_gigi
[pypi]
repository = https://pypi.python.org/pypi
username = the_gigi

Помните, что тестовый сайт регулярно очищается, поэтому не полагайтесь на него. Он предназначен только для тестирования.

Зарегистрируйте свой пакет

Если это первый выпуск вашего пакета, вам необходимо зарегистрировать его с помощью PyPI. Twine имеет команду регистрации, но я не могу понять, как ее использовать. После документации возникает ошибка, и при проверке модульных тестов на шпагат нет теста для команды register. Ну что ж. Вы можете сделать это вручную, используя эту форму, чтобы загрузить файл PKG-INFO. Если вы используете Python 2.7.9+ или Python 3.2+, вы также можете безопасно зарегистрироваться с помощью регистра python setup.py.

Зарегистрируем конмана на тестовом сайте PyPI. Обратите внимание на -r pypitest, который на основе раздела в ~.pypirc будет регистрироваться на тестовом сайте.

python setup.py register -r pypitest
ruing register
ruing egg_info
writing conman.egg-info/PKG-INFO
writing top-level names to conman.egg-info/top_level.txt
writing dependency_links to conman.egg-info/dependency_links.txt
reading manifest file 'conman.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'conman.egg-info/SOURCES.txt'
ruing check
Password:
Registering conman to https://testpypi.python.org/pypi
Server response (200): OK

Twine

Вы можете загрузить пакет с помощью загрузки python setup.py, но он небезопасен, поскольку он используется для отправки вашего имени пользователя и пароля через HTTP до Python 2.7.9 и Python 3.2. Twine всегда использует HTTPS и имеет дополнительные преимущества, такие как загрузка предварительно созданных дистрибутивов и поддерживает любой формат упаковки, включая колеса. Я буду использовать шпагат для фактической загрузки.

Twine не входит в стандартную библиотеку, поэтому вам необходимо установить ее: pip install twine.

Загрузите свой пакет

Наконец, пришло время фактически загрузить пакет.

> twine upload -r pypitest -p ******* dist/*
Uploading distributions to https://testpypi.python.org/pypi
Uploading conman-0.3-py2-none-any.whl
Uploading conman-0.3-py2.py3-none-any.whl
Uploading conman-0.3.tar.gz

Twine загрузила все форматы распространения, как источник, так и колеса.

Тестирование пакета

Как только ваш пакет находится на PyPI, вы должны убедиться, что его можно установить, и все работает. Здесь я создаю одноразовую виртуальную среду, pip install conman из сайта тестирования PyPI, а затем импортирую ее. Возможно, вам захочется провести более тщательные тесты для вашего пакета.

> mkvirtualenv test_conman_pypi
New python executable in test_conman_pypi/bin/python2.7
Also creating executable in test_conman_pypi/bin/pytho
Installing setuptools, pip...done.
Usage: source deactivate
removes the 'bin' directory of the environment activated with 'source
activate' from PATH.
(test_conman_pypi) > pip install -i https://testpypi.python.org/pypi conma
Downloading/unpacking conma
  Downloading conman-0.3-py2-none-any.whl
  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
Installing collected packages: conma
Successfully installed conma
Cleaning up...
(test_conman_pypi) > pytho
Python 2.7.10 (default, Jun 10 2015, 19:43:32)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwi
Type "help", "copyright", "credits" or "license" for more information.
>>> import conma
>>>

Обратите внимание, что распределение колес было установлено по умолчанию.

Versioning

Когда вы разрабатываете свои пакеты и загружаете новые версии, важно следовать разумной схеме управления версиями. Люди будут очень расстроены, если непреднамеренное обновление нарушит их код. Ваша схема управления версиями должна соответствовать PEP-440 - Идентификация версии и спецификация зависимостей.

Эта спецификация позволяет выбирать несколько схем. Я рекомендую использовать популярную схему Semantic Versioning. Это в значительной степени «..», что соответствует PEP-440 «..». Просто остерегайтесь версий, продолжающих знаки дефиса или плюс, которые несовместимы с PEP-440.

Репозитории частных пакетов

PyPI отлично, но иногда вы не хотите делиться своими пакетами. Многие компании и организации имеют инженерные команды, которые используют Python и должны обмениваться пакетами между ними, но не могут публично публиковать их на PyPI. Это не проблема. Вы можете обмениваться пакетами в частных репозиториях пакетов под вашим контролем.

Обратите внимание, что иногда вам может понадобиться иметь закрытый репозиторий пакетов под вашим контролем, чтобы управлять зависимостями сторонних разработчиков. Например, автор пакета может решить удалить пакет из PyPI. Если ваша система полагается на возможность установки этого пакета из PyPI, у вас проблемы.

Devpi

Devpi (который обозначает индекс пакета разработки) является заменой для публичного сервера PyPI. Это лицензия с открытым исходным кодом и MIT, поэтому вы можете запустить ее в своем брандмауэре. Devpi является очень мощным и имеет множество функций, которые позволяют ему функционировать как ваш конечный сервер упаковки:

Быстрое зеркало PyPI. Загрузка, тестирование и стадия с частными индексами. Наследование индексов. Веб-интерфейс и поиск. Репликация Импорт Экспорт интеграции Jenkins.

Devpi имеет отличную документацию, плагиновую систему и активно развивается с энергичным сообществом.

Заключение

Python предоставляет полное решение для размещения ваших пакетов и предоставления их доступным вашим коллегам Pythonistas. Существует оптимизированный процесс, в котором помогают инструменты для упаковки и загрузки пакетов и упрощения их поиска и установки.

Если вам нужно сохранять конфиденциальность, Devpi здесь для вас как зрелый и надежный частный репозиторий пакетов.