Документация Python неофициальный перевод
Содержание страницы

4. Создание дистрибутива исходного кодаCreating a Source Distribution

Как показано в разделе Простой пример, для создания дистрибутива исходного кода используется команда sdist. В простейшем случае

python setup.py sdist

(при условии, что в скрипте установки или файле конфигурации не были указаны параметры sdist), sdist создаёт архив в формате, принятом по умолчанию для текущей платформы. По умолчанию на Unix это сжатый gzip tar-файл (.tar.gz), а на Windows – ZIP-файл.

Можно указать любое количество форматов с помощью параметра --formats, например:

python setup.py sdist --formats=gztar,zip

чтобы создать tar-архив, сжатый gzip, и zip-архив. Доступны следующие форматы:

Формат

Описание

Примечания

zip

zip-файл (.zip)

(1),(3)

gztar

сжатый gzip tar-файл (.tar.gz)

(2)

bztar

сжатый bzip2 tar-файл (.tar.bz2)

xztar

сжатый xz tar-файл (.tar.xz)

ztar

сжатый tar-файл (.tar.Z)

(4)

tar

tar-файл (.tar)

Изменено в версии 3.5: Добавлена поддержка формата xztar.

Примечания:

  1. по умолчанию на Windows

  2. по умолчанию на Unix

  3. требуется внешняя утилита zip или модуль zipfile (входит в стандартную библиотеку Python начиная с Python 1.6)

  4. требуется программа compress. Обратите внимание, что этот формат теперь ожидает устаревания и будет удалён в будущих версиях Python.

При использовании любого формата tar (gztar, bztar, xztar, ztar или tar) в Unix можно указать имена owner и group, которые будут установлены для каждого элемента архива.

Например, чтобы все файлы архива принадлежали пользователю root:

python setup.py sdist --owner=root --group=root

4.1. Указание файлов для распространенияSpecifying the files to distribute

Если не указан явный список файлов (или инструкции по его генерации), команда sdist помещает в дистрибутив исходного кода минимальный набор по умолчанию:

  • все исходные файлы Python, подразумеваемые параметрами py_modules и packages

  • все исходные файлы C, упомянутые в параметрах ext_modules или libraries

  • Скрипты, указанные с помощью опции scripts. См. Установка скриптов.

  • всё, что похоже на тестовый скрипт: test/test*.py (в настоящее время Distutils ничего не делает с тестовыми скриптами, кроме как включает их в дистрибутивы исходного кода, но в будущем появится стандарт для тестирования дистрибутивов модулей Python)

  • Любой из стандартных файлов README (README, README.txt, или README.rst), setup.py (или как вы назвали свой скрипт настройки) и setup.cfg.

  • все файлы, соответствующие метаданным package_data. См. Установка данных пакета.

  • все файлы, соответствующие метаданным data_files. См. Установка дополнительных файлов.

Иногда этого достаточно, но обычно требуется указать дополнительные файлы для распространения. Типичный способ – написать шаблон манифеста, по умолчанию называемый MANIFEST.in. Шаблон манифеста – это просто список инструкций для создания файла манифеста, MANIFEST, который содержит точный перечень файлов, включаемых в дистрибутив исходного кода. Команда sdist обрабатывает этот шаблон и формирует манифест на основе его инструкций и того, что она находит в файловой системе.

Если вы предпочитаете создать собственный файл манифеста, его формат прост: одно имя файла на строку, только обычные файлы (или симлинки на них). Если вы указываете свой собственный MANIFEST, необходимо указать всё: описанный выше стандартный набор файлов в этом случае не применяется.

Изменено в версии 3.1: Существующий сгенерированный MANIFEST будет перегенерирован без сравнения его времени модификации со временем MANIFEST.in или setup.py командой sdist.

Изменено в версии 3.1.3: Файлы MANIFEST начинаются с комментария, указывающего, что они сгенерированы. Файлы без этого комментария не перезаписываются и не удаляются.

Изменено в версии 3.2.2: sdist будет читать файл MANIFEST, если файл MANIFEST.in не существует, как это делалось раньше.

Изменено в версии 3.7: README.rst теперь включён в список стандартных файлов README в distutils.

Шаблон манифеста содержит одну команду на строку, где каждая команда задаёт набор файлов для включения или исключения из дистрибутива исходного кода. В качестве примера снова обратимся к собственному шаблону манифеста Distutils:

include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build

Значения должны быть довольно очевидны: включить все файлы в корне дистрибутива, соответствующие *.txt, все файлы в любом месте каталога examples, соответствующие *.txt или *.py, и исключить все каталоги, соответствующие examples/sample?/build. Всё это делается после стандартного набора включения, поэтому можно исключить файлы из стандартного набора с помощью явных инструкций в шаблоне манифеста. (Или можно использовать опцию --no-defaults, чтобы полностью отключить стандартный набор.) В мини-языке шаблона манифеста доступны и другие команды; см. раздел Создание дистрибутива исходного кода: команда sdist.

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

  • все файлы в дереве «build» Distutils (по умолчанию build/)

  • все файлы в каталогах с именами RCS, CVS, .svn, .hg, .git, .bzr или _darcs

Теперь у нас есть полный список файлов, который записывается в манифест для дальнейшего использования, а затем используется для создания архивов дистрибутива исходного кода.

Стандартный набор включаемых файлов можно отключить с помощью опции --no-defaults, а стандартный набор исключаемых – с помощью --no-prune.

Следуя собственному шаблону манифеста Distutils, проследим, как команда sdist формирует список файлов для включения в дистрибутив исходного кода Distutils:

  1. включить все исходные файлы Python в подкаталогах distutils и distutils/command (поскольку пакеты, соответствующие этим двум каталогам, были указаны в опции packages в скрипте настройки – см. раздел Написание скрипта настройки)

  2. включить README.txt, setup.py и setup.cfg (стандартные файлы)

  3. включить test/test*.py (стандартные файлы)

  4. включить *.txt в корне дистрибутива (это приведёт к повторному обнаружению README.txt, но такие дубликаты будут отсеяны позже)

  5. включить всё, соответствующее *.txt или *.py, в поддереве каталога examples,

  6. исключить все файлы в поддеревьях, начинающихся с каталогов, соответствующих examples/sample?/build – это может исключить файлы, включённые на двух предыдущих шагах, поэтому важно, чтобы команда prune в шаблоне манифеста располагалась после команды recursive-include

  7. исключить всё дерево build, а также любые каталоги RCS, CVS, .svn, .hg, .git, .bzr и _darcs

Как и в скрипте настройки, имена файлов и каталогов в шаблоне манифеста должны всегда разделяться косой чертой; Distutils позаботится о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста переносим между операционными системами.