7. Расширение дистрибутивов

Примечание

Этот документ будет храниться только до тех пор, пока в документации setuptools по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html самостоятельно не будет представлена вся соответствующая информация, которая в настоящее время включена в этот документ.

Дистрибутивы могут быть расширены различными способами. Большинство расширений принимают форму новых команд или заменяют существующие команды. Например, могут быть написаны новые команды для поддержки новых типов пакетов, зависящих от платформы, в то время как существующие команды могут быть заменены, чтобы изменить детали того, как команда работает с пакетом.

Большинство расширений дистрибутивов создаются в скриптах setup.py, которые хотят модифицировать существующие команды; многие просто добавляют несколько расширений файлов, которые следует скопировать в пакеты в дополнение к файлам .py для удобства.

Большинство реализаций команд distutils являются подклассами класса distutils.cmd.Command. Новые команды могут напрямую наследоваться от Command, в то время как замены часто происходят от Command косвенно, непосредственно создавая подкласс команды, которую они заменяют. Команды должны быть производными от Command.

7.1. Интеграция новых команд

Существуют различные способы интеграции новых реализаций команд в distutils. Сложнее всего добиться включения новых функций в сам distutils и дождаться (и потребовать) версию Python, которая обеспечивает эту поддержку. Это действительно сложно по многим причинам.

Наиболее распространенным и, возможно, наиболее разумным для большинства нужд является включение новых реализаций в ваш скрипт setup.py и использование их функцией distutils.core.setup():

from distutils.command.build_py import build_py as _build_py
from distutils.core import setup

class build_py(_build_py):
    """Specialized Python source builder."""

    # implement whatever needs to be different...

setup(cmdclass={'build_py': build_py},
      ...)

Этот подход наиболее ценен, если для использования определенного пакета необходимо использовать новые реализации, поскольку всем, кто заинтересован в этом пакете, потребуется новая реализация команды.

Начиная с версии Python 2.4, доступна третья опция, позволяющая добавлять новые команды, которые могут поддерживать существующие setup.py скрипты, не требуя внесения изменений в установку Python. Ожидается, что это позволит сторонним расширениям обеспечивать поддержку дополнительных систем упаковки, но команды могут использоваться для всего, для чего могут использоваться команды distutils. Новая опция конфигурации command_packages (опция командной строки --command-packages) может быть использована для указания дополнительных пакетов, в которых будет производиться поиск модулей, реализующих команды. Как и все параметры distutils, этот параметр можно задать в командной строке или в файле конфигурации. Этот параметр можно задать только в разделе [global] файла конфигурации или перед любыми командами в командной строке. Если параметр задан в файле конфигурации, его можно переопределить из командной строки; установка его в качестве пустой строки в командной строке приводит к использованию значения по умолчанию. Это значение никогда не должно устанавливаться в файле конфигурации, поставляемом с пакетом.

Эта новая опция может быть использована для добавления любого количества пакетов в список пакетов, в которых выполняется поиск реализаций команд; несколько имен пакетов должны быть разделены запятыми. Если этот параметр не указан, поиск выполняется только в пакете distutils.command. Однако при запуске setup.py с параметром --command-packages distcmds,buildcmds поиск пакетов distutils.command, distcmds, и buildcmds будет производиться в указанном порядке. Ожидается, что новые команды будут реализованы в модулях с тем же именем, что и у команды, классами, использующими то же имя. Учитывая приведенный выше пример параметра командной строки, команда bdist_openpkg может быть реализована классом distcmds.bdist_openpkg.bdist_openpkg или buildcmds.bdist_openpkg.bdist_openpkg.

7.2. Добавление новых типов рассылки

Команды, которые создают дистрибутивы (файлы в каталоге dist/), должны добавить пары (command, filename) к парам self.distribution.dist_files, чтобы upload могли загрузить их в PyPI. имя файла в паре не содержит никакой информации о пути, только имя самого файла. В режиме предварительного запуска пары все равно следует добавлять, чтобы представить, что было бы создано.

Вернуться на верх