Создание дистрибутива исходного кода
Примечание
Этот документ сохраняется только до тех пор, пока документация 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.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. Всё это делается после стандартного набора включения, поэтому вы можете исключить файлы из стандартного набора с явными инструкциями в шаблоне манифеста. (Или вы можете использовать опцию --no-defaults для отключения стандартного набора полностью.) В мини-языке шаблона манифеста доступно несколько других команд; см. раздел Создание дистрибутива исходного кода: команда sdist.
Порядок команд в шаблоне манифеста имеет значение: вначале у нас есть список файлов по умолчанию, как описано выше, и каждая команда в шаблоне добавляет или удаляет из этого списка файлов. После полной обработки шаблона манифеста мы удаляем файлы, которые не должны быть включены в дистрибутив исходного кода:
- все файлы в дереве «build» Distutils (по умолчанию
build/) - все файлы в каталогах с именами
RCS,CVS,.svn,.hg,.git,.bzrили_darcs
Теперь у нас есть полный список файлов, который записывается в манифест для последующего использования, а затем используется для создания архива(ов) дистрибутива исходного кода.
Вы можете отключить набор файлов по умолчанию с помощью опции --no-defaults, и вы можете отключить стандартный набор исключений с помощью --no-prune.
Следуя собственному шаблону манифеста 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в шаблоне манифеста шла после командыrecursive-include - исключить всё дерево
build, а также каталогиRCS,CVS,.svn,.hg,.git,.bzrи_darcs
Так же, как и в скрипте setup, имена файлов и каталогов в шаблоне манифеста всегда должны быть разделены слешами; Distutils позаботится о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста является переносимым между операционными системами.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/distutils/sourcedist.html