Документация 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)

ztar

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

(4)

tar

tar-файл (.tar)

Примечания:

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

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

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

  4. требует программу compress.

При использовании любого формата tar (gztar, bztar, 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, необходимо указать всё: описанный выше стандартный набор файлов в этом случае не применяется.

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

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

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

См. раздел Шаблон MANIFEST.in для справки по синтаксису.

4.3. Шаблон MANIFEST.inThe MANIFEST.in template

Файл MANIFEST.in можно добавить в проект, чтобы определить список файлов, включаемых в дистрибутив, создаваемый командой sdist.

При запуске sdist он ищет файл MANIFEST.in и интерпретирует его для генерации файла MANIFEST, содержащего список файлов, которые будут включены в пакет.

This mechanism can be used when the default list of files is not enough. (See Specifying the files to distribute).

4.3.1. ПринципPrinciple

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

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

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

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

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

4.3.2. КомандыCommands

Команды шаблона манифеста:

Команда

Описание

include pat1 pat2 ...

включить все файлы, соответствующие любому из перечисленных шаблонов

exclude pat1 pat2 ...

исключить все файлы, соответствующие любому из перечисленных шаблонов

recursive-include dir pat1 pat2 ...

включить все файлы в каталоге dir, соответствующие любому из перечисленных шаблонов

recursive-exclude dir pat1 pat2 ...

исключить все файлы в каталоге dir, соответствующие любому из перечисленных шаблонов

global-include pat1 pat2 ...

включить все файлы в любом месте дерева исходного кода, соответствующие – & любому из перечисленных шаблонов

global-exclude pat1 pat2 ...

исключить все файлы в любом месте дерева исходных файлов соответствующие – & любым из перечисленных шаблонов

prune dir

исключить все файлы внутри dir

graft dir

включить все файлы внутри dir

Здесь используются шаблоны Unix-стиля «glob»: * соответствует любой последовательности обычных символов имени файла, ? соответствует любому одному такому символу, а [range] соответствует любому из символов в диапазоне (например, a-z, a-zA-Z, a-f0-9_.). Определение «обычного символа имени файла» зависит от платформы: в Unix это любой символ, кроме косой черты; в Windows любой символ, кроме обратной косой черты или двоеточия.