В какой-то момент разработчик понимает, что хочет делиться своим кодом с другими программистами. Он может написать библиотеку полезных функций или готовую программу, а затем передать ее другим. В таких случаях используются пакеты.
Как работают пакеты
Часто пакеты описываются как наборы модулей и вложенных пакетов. Но это не единственное значение этого термина. В более широком смысле пакет — это некая единица обмена кодом между разработчиками.
Python-пакет содержит исходный код и метаданные — дополнительную информацию о пакете, в том числе:
- Предназначение пакета
- Текущую версию пакета и список предыдущих версий
- Совместимость с разными версиями Python
- Лицензию, под которой распространяется пакет
- Список зависимостей пакета
Индекс
Предположим, что мы создали готовый пакет и хотим поделиться им с миром. Собранный пакет представляет собой обычный файл, который можно передать другому человеку. Это самый простой случай.
Усложним задачу и представим, что наш пакет требует каких-то других пакетов для своей работы. Вот тут-то и начнутся сложности — нужно будет приложить к нашему пакету дополнительные пакеты, которые могут потребовать еще больше пакетов. И этот цикл может продолжаться бесконечно.
Чтобы справиться с этой сложностью, воспользуемся репозиториями пакетов — в Python их принято называть индексами.
Такие индексы содержат пакеты. А еще они предоставляют пользователю удобный интерфейс для поиска пакетов и знакомства с их описанием. Обычно он сделан в виде web-сайта.
Самый популярный индекс пакетов — это PyPI или Python Package Index. Чаще всего вы будете работать именно с ним.
Но есть и другие индексы. Большинство инструментов работы с пакетами могут работать с разными индексами. К примеру, отдельные индексы используются многими компаниями для размещения пакетов, которые не являются открытыми (open source).
Еще один полезный индекс — Test PyPI. Это специальный индекс пакетов, который принято использовать для обучения работе с системой пакетирования Python.
Не очень удобно выставлять на всеобщее обозрение сотни и даже тысячи учебных пакетов. Они попадаются в поиске, занимают удобные имена другими, замусоривают основной индекс.
Тестовый индекс работает точно так же, как основной PyPI. Он позволяет выкладывать и скачивать пакеты, но периодически удаляет все данные.
Индексы vs GitHub, BitBucket и прочие хранилища кода
В наши дни некоторые репозитории пакетов не хранят пакеты своими силами, а берут на себя только индексацию и управление метаданными пакетов. При этом код предлагается хранить на GitHub, BitBucket, GitLab, другими словами — в хранилищах исходного кода.
Такой подход в целом работает для интерпретируемых языков — в любом случае нужно иметь доступ к исходному коду, чтобы использовать код пакета.
Но хранение кода на сторонних ресурсах по отношению к источнику метаданных обладает рядом недостатков.
Во-первых, опубликованным кодом владеет только автор кода. Автор может удалить свой репозиторий, а информация о пакете в индексе сохранится. Те, кто уже начал использовать пакет, столкнутся с невозможностью сборки своих проектов.
Во-вторых, GitHub и другие хранилища Git-репозиториев не гарантирует неизменность данных в репозитории при использовании одних только тегов и веток. А ведь именно такой способ привязки состояния кода к информации в индексе и используется чаще всего — то есть любой обладатель доступа к репозиторию может переписать его историю. Даже если привязывать версии пакетов в индексе к hash-суммам коммитов в Git, то изменение в истории приведет к первой проблеме — версия пакета будет ссылаться на несуществующий источник кода. При переписывании истории hash-суммы коммитов тоже поменяются.
Обе озвученные причины приводят к тому, что ломается важное свойство системы пакетирования — воспроизводимость сборки. Это свойство подразумевает, что любой проект с точным описанием своих зависимостей запустится в любой момент времени, даже если проект использует очень старые версии пакетов и интерпретатора.
Для воспроизводимости больше подходит централизованный индекс, который самостоятельно хранит все версии всех пакетов в неизменяемом виде. Так программист получает значительно больше гарантий, что старый проект запустится в любое время и в любых обстоятельствах.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.