Создание распределения исходных кодов
Примечание
Данный документ сохраняется только до тех пор, пока документация setuptools по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html не покроет всю необходимую информацию, которая сейчас здесь содержится.
Как показано в разделе Простой пример, для создания распределения исходных кодов используется команда sdist. В самом простом случае,
python setup.py sdist
(если вы не указали никаких опций sdist в скрипте setup или файле конфигурации), sdist создаёт архив в формате по умолчанию для текущей платформы. По умолчанию используется сжатый tar-архив (.tar.gz) в Unix и ZIP-архив в Windows.
Вы можете указать любое количество форматов, используя опцию --formats, например:
python setup.py sdist --formats=gztar,zip
для создания сжатого tar-архива и ZIP-архива. Доступные форматы:
Формат | Описание | Примечания |
|---|---|---|
| ZIP-архив ( | (1),(3) |
| Сжатый tar-архив ( | (2) |
| Сжатый tar-архив bzip2 ( | (5) |
| Сжатый tar-архив xz ( | (5) |
| Сжатый tar-архив ( | (4),(5) |
| Tar-архив ( | (5) |
Изменено в версии 3.5: Добавлена поддержка формата xztar.
Примечания:
- по умолчанию в Windows
- по умолчанию в Unix
- требуется либо внешняя утилита zip, либо модуль
zipfile(входит в стандартную библиотеку Python начиная с Python 1.6) - требуется программа compress. Обратите внимание, что данный формат в настоящее время планируется к устареванию и будет удалён в будущих версиях Python.
- устарел согласно PEP 527; PyPI принимает только файлы форматов
.zipи.tar.gz.
При использовании любого формата tar (gztar, bztar, xztar, ztar или tar) в Unix можно указать имена owner и group, которые будут установлены для каждого элемента архива.
Например, если вы хотите, чтобы все файлы в архиве принадлежали пользователю root:
python setup.py sdist --owner=root --group=root
4.1. Указание файлов для распределения
Если вы не предоставите явный список файлов (или инструкции по его генерации), команда sdist добавит минимальный набор файлов по умолчанию в распределение исходных кодов:
- все файлы исходного кода Python, указанные опциями
py_modulesиpackages - все файлы исходного кода C, указанные в опциях
ext_modulesилиlibraries - скрипты, идентифицированные опцией
scripts. См. Установка скриптов. - все, что выглядит как скрипт для тестирования:
test/test*.py(в настоящее время Distutils не выполняют никаких действий со скриптами тестирования, кроме включения их в распределения исходных кодов, но в будущем будет стандарт для тестирования распределений модулей Python) - любые стандартные файлы README (
README,README.txt, илиREADME.rst),setup.py(или как вы назвали свой скрипт setup) иsetup.cfg. - все файлы, соответствующие метаданным
package_data. См. Установка данных пакета. - все файлы, соответствующие метаданным
data_files. См. Установка дополнительных файлов.
Иногда этого достаточно, но обычно вам нужно указать дополнительные файлы для распределения. Обычно это делается путём написания шаблона файла manifest, по умолчанию называемого MANIFEST.in. Шаблон manifest – это просто список инструкций по генерации файла manifest, MANIFEST, который содержит точный список файлов для включения в распределение исходных кодов. Команда sdist обрабатывает этот шаблон и генерирует manifest на основе его инструкций и того, что находит в файловой системе.
Если вы предпочитаете создавать собственный файл manifest, формат прост: один имя файла на строке, только обычные файлы (или ссылки на них). Если вы предоставляете свой собственный MANIFEST, вы должны указать всё: набор файлов по умолчанию в этом случае не применяется.
Изменено в версии 3.1: Существующий сгенерированный файл MANIFEST будет перегенерирован без сравнения sdist его времени модификации со временем модификации MANIFEST.in или setup.py.
Изменено в версии 3.1.3: Файлы MANIFEST начинаются с комментария, указывающего на то, что они сгенерированы. Файлы без этого комментария не перезаписываются и не удаляются.
Изменено в версии 3.2.2: sdist будет читать файл MANIFEST если файл MANIFEST.in отсутствует, как это делалось раньше.
Изменено в версии 3.7: README.rst теперь включен в список стандартных файлов README Distutils.
Шаблон manifest содержит одну команду на строку, где каждая команда определяет набор файлов для включения или исключения из распределения исходного кода. В качестве примера рассмотрим собственный шаблон manifest Distutils:
include *.txt recursive-include examples *.txt *.py prune examples/sample?/build
Значения должны быть достаточно ясными: включить все файлы в корне распределения, соответствующие *.txt, все файлы в подкаталоге examples соответствующие *.txt или *.py, и исключить все каталоги, соответствующие examples/sample?/build. Всё это делается *после* стандартного набора включений, поэтому вы можете исключить файлы из стандартного набора с помощью явных инструкций в шаблоне manifest. (Или вы можете использовать опцию --no-defaults для полного отключения стандартного набора). В шаблоне manifest доступны и другие команды; см. раздел Создание распределения исходного кода: команда sdist.
Порядок команд в шаблоне manifest важен: сначала у нас есть список файлов по умолчанию, как описано выше, и каждая команда в шаблоне добавляет или удаляет из этого списка файлов. После полной обработки шаблона manifest, мы удаляем файлы, которые не должны быть включены в распределение исходного кода:
- все файлы в дереве “build” Distutils (по умолчанию
build/) - все файлы в каталогах с именами
RCS,CVS,.svn,.hg,.git,.bzrили_darcs
Теперь у нас есть полный список файлов, который записывается в manifest для дальнейшего использования, а затем используется для создания архива(ов) распределения исходного кода.
Вы можете отключить стандартный набор включаемых файлов с помощью опции --no-defaults, а также отключить стандартный набор исключений с помощью --no-prune.
Следуя собственной структуре manifest Distutils, отследим, как команда sdist создаёт список файлов для включения в распределение исходного кода Distutils:
- включить все файлы исходного кода Python в подкаталогах
distutilsиdistutils/command(потому что пакеты, соответствующие этим двум каталогам, были упомянуты в опцииpackagesв скрипте setup — см. раздел Написание скрипта setup) - включить
README.txt,setup.py, иsetup.cfg(стандартные файлы) - включить
test/test*.py(стандартные файлы) - включить
*.txtв корне распределения (этот файл будет найден ещё раз, но такие дубликаты отфильтруются позже) - включить всё, что соответствует
*.txtили*.pyв поддереве под каталогомexamples, - исключить все файлы в поддеревьях, начинающихся с каталогов, соответствующих
examples/sample?/build— это может исключить файлы, включенные двумя предыдущими шагами, поэтому важно, чтобы командаpruneв шаблоне manifest шла после командыrecursive-include - исключить всё дерево
build, а также любые каталогиRCS,CVS,.svn,.hg,.git,.bzrи_darcs
Как и в скрипте setup, имена файлов и каталогов в шаблоне manifest всегда должны быть разделяться слэшами; Distutils позаботятся о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон manifest переносим между операционными системами.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/distutils/sourcedist.html