4. Создание исходного распределения¶
Примечание
Этот документ сохраняется исключительно до тех пор, пока документация setuptools
на сайте https://setuptools.readthedocs.io/en/latest/setuptools.html не будет независимо охватывать всю соответствующую информацию, включенную сюда в настоящее время.
Как показано в разделе Простой пример, для создания исходного дистрибутива используется команда sdist. В простейшем случае,
python setup.py sdist
(при условии, что вы не указали никаких опций sdist в сценарии установки или конфигурационном файле), sdist создает архив формата по умолчанию для текущей платформы. Формат по умолчанию - это gzip’ed tar-файл (.tar.gz
) на Unix и ZIP-файл на Windows.
Вы можете указать любое количество форматов, используя опцию --formats
, например:
python setup.py sdist --formats=gztar,zip
для создания gzipped tarball и zip-файла. Доступны следующие форматы:
Формат |
Описание |
Примечания |
---|---|---|
|
zip-файл ( |
(1),(3) |
|
gzip’ed tar-файл ( |
(2) |
|
bzip2’ed tar-файл ( |
(5) |
|
xz’ed tar-файл ( |
(5) |
|
сжатый tar-файл ( |
(4),(5) |
|
tar-файл ( |
(5) |
Изменено в версии 3.5: Добавлена поддержка формата xztar
.
Примечания:
по умолчанию в Windows
по умолчанию в Unix
требует либо внешней утилиты zip, либо модуля
zipfile
(часть стандартной библиотеки Python, начиная с Python 1.6)требуется программа compress. Обратите внимание, что этот формат в настоящее время находится на стадии устаревания и будет удален в будущих версиях Python.
deprecated by 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.cfg
.все файлы, соответствующие метаданным
package_data
. См. Установка данных пакета.все файлы, соответствующие метаданным
data_files
. См. Установка дополнительных файлов.
Иногда этого достаточно, но обычно вы захотите указать дополнительные файлы для распространения. Типичный способ сделать это - написать шаблон манифеста, который по умолчанию называется MANIFEST.in
. Шаблон манифеста - это просто список инструкций по созданию вашего файла манифеста, MANIFEST
, который является точным списком файлов, включаемых в ваш исходный дистрибутив. Команда sdist обрабатывает этот шаблон и генерирует манифест на основе его инструкций и того, что она находит в файловой системе.
Если вы предпочитаете развернуть свой собственный файл манифеста, формат прост: одно имя файла в строке, только обычные файлы (или симлинки на них). Если вы предоставляете свой собственный 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.
Шаблон манифеста имеет одну команду в строке, где каждая команда определяет набор файлов для включения или исключения из исходного дистрибутива. Для примера снова обратимся к собственному шаблону манифеста Distutils:
include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build
Значения должны быть достаточно ясны: включить все файлы в корне дистрибутива, соответствующие *.txt
, все файлы в любом месте каталога examples
, соответствующие *.txt
или *.py
, и исключить все каталоги, соответствующие examples/sample?/build
. Все это делается после стандартного набора include, поэтому вы можете исключить файлы из стандартного набора с помощью явных инструкций в шаблоне манифеста. (Или вы можете использовать опцию --no-defaults
, чтобы полностью отключить стандартный набор). Есть несколько других команд, доступных в мини-языке шаблона манифеста; см. раздел Создание исходного дистрибутива: команда sdist.
Порядок команд в шаблоне манифеста имеет значение: изначально у нас есть список файлов по умолчанию, как описано выше, и каждая команда в шаблоне добавляет или удаляет из этого списка файлы. После полной обработки шаблона манифеста мы удаляем файлы, которые не должны быть включены в исходный дистрибутив:
все файлы в дереве «сборки» Distutils (по умолчанию
build/
)все файлы в каталогах с именами
RCS
,CVS
,.svn
,.hg
,.git
,.bzr
или_darcs
Теперь у нас есть полный список файлов, который записывается в манифест для дальнейшего использования, а затем используется для сборки архива(ов) исходного дистрибутива.
Вы можете отключить стандартный набор включенных файлов с помощью опции --no-defaults
, а стандартный набор исключенных файлов можно отключить с помощью --no-prune
.
Следуя собственному шаблону манифеста Distutils, давайте проследим, как команда sdist формирует список файлов для включения в исходный дистрибутив Distutils:
включить все исходные файлы Python в подкаталогах
distutils
иdistutils/command
(поскольку пакеты, соответствующие этим двум каталогам, были упомянуты в опцииpackages
в сценарии установки - см. раздел Написание сценария настройки)include
README.txt
,setup.py
иsetup.cfg
(стандартные файлы)include
test/test*.py
(стандартные файлы)включить
*.txt
в корень дистрибутива (при этомREADME.txt
будет найден второй раз, но такие излишества удаляются позже)включать все, что соответствует
*.txt
или*.py
в поддерево подexamples
,исключить все файлы в поддеревьях, начинающихся с каталогов, соответствующих
examples/sample?/build
—это может исключить файлы, включенные предыдущими двумя шагами, поэтому важно, чтобы командаprune
в шаблоне манифеста шла после командыrecursive-include
исключить все дерево
build
и все каталогиRCS
,CVS
,.svn
,.hg
,.git
,.bzr
и_darcs
Как и в сценарии установки, имена файлов и каталогов в шаблоне манифеста всегда должны быть разделены косой чертой; Distutils позаботится о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста будет переносимым в разных операционных системах.