4. Создание исходного дистрибутива¶
Примечание
Этот документ будет храниться только до тех пор, пока в документации setuptools
по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html самостоятельно не будет представлена вся соответствующая информация, которая в настоящее время включена в этот документ.
Как показано в разделе Простой пример, для создания исходного дистрибутива используется команда sdist. В простейшем случае,
python setup.py sdist
(при условии, что вы не указали никаких параметров sdist в сценарии установки или конфигурационном файле), sdist создает архив формата по умолчанию для текущей платформы. Формат по умолчанию - tar-файл в формате gzip (.tar.gz
) в Unix и ZIP-файл в Windows.
Вы можете указать столько форматов, сколько захотите, используя опцию --formats
, например:
python setup.py sdist --formats=gztar,zip
для создания архивной папки в формате gzip и zip-файла. Доступны следующие форматы:
Формат |
Описание |
Записи |
---|---|---|
|
zip-файл ( |
(1),(3) |
|
сжатый tar-файл ( |
(2) |
|
tar-файл в формате bzip2 ( |
(5) |
|
исправленный 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
все исходные файлы на языке Си, указанные в параметрах
ext_modules
илиlibraries
сценарии, указанные с помощью параметра
scripts
, см. в разделе Установка скриптов.все, что выглядит как тестовый скрипт:
test/test*.py
(в настоящее время дистрибутивы ничего не делают с тестовыми скриптами, кроме как включают их в исходные тексты, но в будущем появится стандарт для тестирования дистрибутивов модулей 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:
include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build
Значения должны быть достаточно ясными: включить все файлы в корневой каталог дистрибутива, соответствующие *.txt
, все файлы в любом месте каталога examples
, соответствующие *.txt
или *.py
, и исключить все каталоги, соответствующие examples/sample?/build
. Все это выполняется после установки стандартного набора, поэтому вы можете исключить файлы из стандартного набора с помощью явных инструкций в шаблоне манифеста. (Или вы можете использовать параметр --no-defaults
, чтобы полностью отключить стандартный набор.) В мини-языке шаблона манифеста доступно несколько других команд; смотрите раздел Создание дистрибутива с исходным кодом: команда sdist.
Порядок следования команд в шаблоне манифеста имеет значение: изначально у нас есть список файлов по умолчанию, как описано выше, и каждая команда в шаблоне добавляет или удаляет файлы из этого списка. Как только мы полностью обработаем шаблон манифеста, мы удалим файлы, которые не должны быть включены в исходный дистрибутив.:
все файлы в дереве Distutils «build» (по умолчанию
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
Как и в сценарии установки, имена файлов и каталогов в шаблоне манифеста всегда должны разделяться косой чертой; средства дистрибутива позаботятся о преобразовании их в стандартное представление на вашей платформе. Таким образом, шаблон манифеста можно переносить в разные операционные системы.