Содержание страницы
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-файл ( |
(1),(3) |
|
сжатый gzip tar-файл
( |
(2) |
|
сжатый bzip2 tar-файл
( |
|
|
сжатый xz tar-файл
( |
|
|
сжатый tar-файл
( |
(4) |
|
tar-файл ( |
Изменено в версии 3.5: Добавлена поддержка формата xztar.
Примечания:
по умолчанию на Windows
по умолчанию на Unix
требуется внешняя утилита zip или модуль
zipfile(входит в стандартную библиотеку Python начиная с Python 1.6)требуется программа 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 (
README,README.txt, илиREADME.rst),setup.py(или как вы назвали свой скрипт настройки) и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 не существует, как это делалось раньше.
Изменено в версии 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в скрипте настройки – см. раздел Написание скрипта настройки)включить
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
Как и в скрипте настройки, имена файлов и каталогов в шаблоне манифеста должны всегда разделяться косой чертой; Distutils позаботится о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста переносим между операционными системами.