Содержание страницы
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-файл
( |
|
|
сжатый tar-файл
( |
(4) |
|
tar-файл ( |
Примечания:
по умолчанию на Windows
по умолчанию на Unix
требуется внешняя утилита zip или модуль
zipfile(входит в стандартную библиотеку Python начиная с Python 1.6)требует программу 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.in¶The 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:
включить все исходные файлы 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 позаботится о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста переносим между операционными системами.
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
любой символ, кроме обратной косой черты или двоеточия.