Создание дистрибутива исходного кода
Примечание
Данный документ сохраняется только до тех пор, пока документация setuptools по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html не охватывает всю необходимую информацию, которая в настоящее время содержится здесь.
Как показано в разделе Простой пример, для создания дистрибутива исходного кода используется команда sdist. В самом простом случае,
python setup.py sdist
(при условии, что в скрипте setup или файле конфигурации не указаны никакие параметры sdist), команда sdist создаёт архив в формате по умолчанию для текущей платформы. Формат по умолчанию — это сжатый gzip-архив tar (.tar.gz) в Unix и ZIP-архив в Windows.
Вы можете указать любое количество форматов, используя опцию --formats, например:
python setup.py sdist --formats=gztar,zip
для создания сжатого tar-архива и ZIP-архива. Доступные форматы:
Формат | Описание | Примечания |
|---|---|---|
| ZIP-архив ( | (1),(3) |
| Сжатый gzip-архив tar ( | (2) |
| Сжатый bzip2-архив tar ( | (5) |
| Сжатый xz-архив tar ( | (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в корне дистрибутива (это найдётREADME.txtвторой раз, но такие дубликаты будут удалены позже) - включить всё, что соответствует
*.txtили*.pyв поддереве под каталогомexamples, - исключить все файлы в поддеревьях, начинающихся с каталогов, соответствующих
examples/sample?/build— это может исключить файлы, включённые в предыдущих двух шагах, поэтому важно, чтобы командаpruneв шаблоне манифеста шла после командыrecursive-include - исключить всё дерево каталогов
build, и любые каталогиRCS,CVS,.svn,.hg,.git,.bzrи_darcs
Точно так же, как и в скрипте setup, имена файлов и каталогов в шаблоне манифеста всегда должны быть разделяться слешами; Distutils позаботятся о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста портативен между операционными системами.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/distutils/sourcedist.html