Документация 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.txt (или README), setup.py (или как бы вы ни назвали свой сценарий setup), и 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 не существует, как это делалось раньше.

Шаблон манифеста содержит одну команду на строку, где каждая команда задаёт набор файлов для включения или исключения из дистрибутива исходного кода. В качестве примера снова обратимся к собственному шаблону манифеста 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 позаботится о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста переносим между операционными системами.