обзор
Пакеты Python являются строительными блоками приложений Python. Они содержат некоторые согласованные функции, которые могут быть импортированы и использованы многими приложениями и системами. Но сначала разработчики должны найти ваш пакет и иметь возможность его установить. Python предоставляет бесплатный общедоступный репозиторий для пакетов, который является стандартом де-факто для совместного использования пакетов Python. Вы также можете использовать частные репозитории пакетов для проприетарных пакетов.
Из этого руководства вы узнаете, как поделиться своими пакетами с сообществом. Если у вас есть проприетарные пакеты, которыми вы должны поделиться только внутри вашей компании, вы также узнаете, как это сделать.
Для справки смотрите Как использовать пакеты Python и Как писать свои собственные пакеты Python .
Что такое PyPI?
PyPI обозначает индекс пакета Python. Это публичный репозиторий для загрузки ваших пакетов. Pip знает о PyPI и может устанавливать и / или обновлять пакеты из PyPI. PyPI раньше называли «Магазином сыра» по знаменитому эскизу Монти Пайтона. Если вы слышите, как люди ссылаются на «Магазин сыра» в контексте упаковки Python, не пугайтесь. Это просто PyPI.
Подготовить пакет для загрузки
Перед загрузкой пакета вам необходимо иметь пакет. Я буду использовать пакет conman, который я представил в статье Как написать свой собственный пакет Python . Поскольку PyPI содержит тысячи пакетов, очень важно правильно описать ваш пакет, если вы хотите, чтобы люди его нашли. PyPI поддерживает впечатляющий набор метаданных тегов, чтобы люди могли найти подходящий пакет для работы.
Файл setup.py содержит много важной информации, используемой для установки вашего пакета. Но он также может включать метаданные, используемые для классификации вашего пакета в PyPI. Пакеты классифицируются с использованием нескольких тегов метаданных. Некоторые из них являются текстовыми, а некоторые имеют список возможных значений. Полный список доступен на странице классификаторов списков PyPI.
Давайте добавим несколько классификаторов в setup.py
. Нет необходимости увеличивать номер версии, поскольку это только метаданные, а код остается прежним:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
from setuptools import setup, find_packages
setup(name=’conman’,
version=’0.3′,
url=’https://github.com/the-gigi/conman’,
license=’MIT’,
author=’Gigi Sayfan’,
author_email=’[email protected]’,
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
в вашем домашнем каталоге, который будет содержать информацию, необходимую для загрузки пакетов.
01
02
03
04
05
06
07
08
09
10
11
|
[distutils]
index-servers=pypi
[pypi]
repository = https://pypi.python.org/pypi
username = the_gigi
|
Вы также можете добавить свой пароль, но это безопаснее, если вы не добавите какой-то плохой элемент к вашему ноутбуку. Это особенно важно, если вы загружаете популярные пакеты, потому что если кто-то может загрузить или обновить ваши пакеты, все люди, которые используют эти пакеты, будут уязвимы.
тестирование
Если вы хотите протестировать процесс регистрации пакета и загрузки и не беспокоиться о публикации чего-то неполного, вы можете работать с альтернативным сайтом тестирования PyPI . Расширьте файл ~ / .pypirc, включив в него раздел «pypitest».
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[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 register
.
Давайте зарегистрируем conman на тестовом сайте PyPI. Обратите внимание на параметр -r pypitest
, который на основе раздела в ~/.pypirc
будет зарегистрирован на тестовом сайте.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
python setup.py register -r pypitest
running register
running 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’
running check
Password:
Registering conman to https://testpypi.python.org/pypi
Server response (200): OK
|
Шпагат
Вы можете загрузить пакет, используя python setup.py upload
, но это небезопасно, поскольку используется для отправки вашего имени пользователя и пароля по HTTP до Python 2.7.9 и Python 3.2. Twine всегда использует HTTPS и имеет дополнительные преимущества, такие как загрузка предварительно созданных дистрибутивов, и поддерживает любой формат упаковки, включая колеса. Я буду использовать шпагат для фактической загрузки.
Twine не является частью стандартной библиотеки, поэтому вам необходимо установить его: pip install twine
.
Загрузить свой пакет
Наконец, пришло время загрузить пакет.
1
2
3
4
5
6
7
8
9
|
> 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 conman с сайта тестирования PyPI, а затем импортирую ее. Возможно, вы захотите запустить более тщательные тесты для вашего пакета.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
> mkvirtualenv test_conman_pypi
New python executable in test_conman_pypi/bin/python2.7
Also creating executable in test_conman_pypi/bin/python
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 conman
Downloading/unpacking conman
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: conman
Successfully installed conman
Cleaning up…
(test_conman_pypi) > python
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 darwin
Type «help», «copyright», «credits» or «license» for more information.
>>> import conman
>>>
|
Обратите внимание, что распределение колес было установлено по умолчанию.
Versioning
Когда вы развиваете свои пакеты и загружаете новые версии, важно следовать разумной схеме управления версиями. Люди будут очень расстроены, если непреднамеренное обновление нарушит их код. Ваша схема управления версиями должна соответствовать PEP-440 — Идентификация версии и спецификация зависимостей .
Эта спецификация позволяет выбирать из нескольких схем. Я рекомендую использовать популярную схему Semantic Versioning . Это в значительной степени «<major>. <Minor>. <Patch>», что соответствует PEP-440 «<major>. <Minor>. <Micro>». Просто остерегайтесь версий, продолжающих дефис или знаки плюс, которые не совместимы с PEP-440.
Частные хранилища пакетов
PyPI великолепен, но иногда вы не хотите делиться своими пакетами. Во многих компаниях и организациях есть инженерные команды, которые используют Python и должны обмениваться пакетами между ними, но им запрещено публиковать их публично в PyPI. Это не проблема. Вы можете делиться пакетами в частных репозиториях пакетов под вашим контролем.
Обратите внимание, что иногда вы можете захотеть иметь закрытое хранилище пакетов под вашим контролем, чтобы управлять сторонними зависимостями. Например, автор пакета может решить удалить пакет из PyPI. Если ваша система полагается на возможность установки этого пакета из PyPI, у вас проблемы.
Devpi
Devpi (что означает «Индекс пакета разработки») является заменой общедоступного сервера PyPI. Он имеет открытый исходный код и лицензирован по MIT, поэтому вы можете запустить его в своем брандмауэре. Devpi очень мощный и имеет много функций, которые позволяют ему функционировать как ваш конечный сервер упаковки:
- Быстрое зеркало PyPI
- Загрузка, тестирование и размещение с частными индексами
- Индекс наследования
- Веб-интерфейс и поиск
- копирование
- Импорт / Экспорт
- Интеграция Дженкинса
Devpi имеет отличную документацию, систему плагинов и находится в активной разработке с активным сообществом.
Вывод
Python предоставляет комплексное решение для размещения ваших пакетов и предоставления их вашим коллегам по Pythonistas. Существует упрощенный процесс, которому помогают инструменты для упаковки и загрузки пакетов и облегчают их поиск и установку.
Если вам нужно держать вещи в секрете, Devpi здесь для вас как зрелого и надежного частного хранилища пакетов.