Пакеты, продукты и яйца
Посмотрим на концепцию глубже
Теминология
Прежде всего необходимо познакомиться с определениями:
- Software home (домашняя директория Zope) - директория установки Zope ($SOFTWARE_HOME)
- Zope instance (экземпляр Zope, инстанс) - процесс операционной системы, который обслуживает HTTP взаимодействие с базой данных Zope (ZODB). Также код на python и конфигурационные файлы необходимые для выполнения этого процесса.
Одна установка Zope может содержать несколько инстансов. Используйте рецепт buildout plone.recipe.zope2instance, чтобы создать новый экземпляр Zope в buildout окружении. Несколько инстансов могут использовать данные из одного файла Data.fs, используя ZEO сервер. - Python path (python путь) - порядок и место, в котором python-интерпретатор будет искать модули. В python доступен через sys.path. При выполнении Zope этот python path обычно включает глобальные python модули, составляющие стандартную библиотеку, директорию site-packages, где установлены дополнительные глобальные модули и пакеты, домашнюю директорию Zope и директорию lib/python внутри домашней директории инстанса. Python скрипты могут включать дополнительные пути в эту переменную во время выполнения. Эта возможность используется zc.buildout.
- Python package (python пакет) - общий термин обозначающий, распространяемые Python модули. В общем случае это папка, в которой есть файл __init__.py и другой код на python.
- Zope product (zope продукт) - особый тип пакетов Python используемых для расширения функциональности Zope. В старых версиях Zope все продукты были папками в директории Products, и они должны были иметь имя начинающееся c Products. Например, продукт CMFPlone - ядро Plone, известен в Python как Products.CMFPlone
- Python egg (python егг-пакет, яйцо) - способ упаковки и распространения модуля Python. Каждый егг-пакет содержит файл setup.py c метаданными (такими как имя и емейл автора и сведения о лицензии) и информацию о зависимостях. Механизм eggs обеспечивается setuptools, которая способна автоматически находить и загружать зависимости для устанавливаемых пакетов. Возможно также использовать разные версии одних и тех же пакетов-зависимостей для разных модулей. Егг-пакеты поддерживают также точки входа, для обеспечения механизма плагинов. Больше информации доступно на сайте PEAK.
- The Python Package Index (индекс python-пакетов)- это база из тысяч Python пакетов для загрузки. Она доступна в виде веб-сайта. Но что более важно инструменты на основе setuptools (buildout и easy_install) могут выполнять запросы к этой базе и устанавливать егг-пакеты автоматически. Также она называется Cheese Shop или PyPI
- easy_install - инструмент с интерфейсом командной строки для автоматического поиска и установки пакетов в Python среду. Cкрипт easy_install - часть пакета setuptools, который используется PyPI в качестве источника пакетов.
- Namespace package (пространство имен пакета) - особенность setuptools, которая делает возможным распространение многочисленных отдельных пакетов, разделяющих единое пространство имен верхнего уровня. Например, пакеты plone.theme и plone.portlets разделяют пространство имен "plone", но они распространяются как отдельные егг-пакеты. При установке исходный код каждого пакета находится в своей отдельной директории (или возможно в виде архива этой директории). Благодаря пространству имен отпадает необходимость поставлять один гигантский пакет plone, в корне которого содержаться все возможные пакеты, например plone/theme и plone/portlets.
Магия пространства имен Products
Каждый раз при старте когда Zope находит продукт, он создает запись в Control_Panel/Products в корне ZMI и выполняет метод intialize(), который находится в файле __init__.py в корневой директории продукта. Не каждый пакет в Plone должен быть продуктом, но это требуется для пакетов, которые:
- содержат профиль GenericSetup
- содержать скины, которые должны быть установлены как слои в portal_skins (для Zope 3 представлений браузера это не требуется)
Самый простой способ создания продукта это использование Paster/ZopeSkel с шаблоном basic_namespace:
$ paster create -t basic_namespace Products.myproduct Selected and implied templates: ZopeSkel#basic_namespace A project with a namespace package Variables: egg: Products.myproduct package: productsmyproduct project: Products.myproduct Enter namespace_package (Namespace package (like plone)) ['plone']: Products Enter package (The package contained namespace package (like example)) ['example']: myproduct ... accept defaults to end
Если вы используете buildout, создайте свой пакет в директории src и добавьте ссылку на него в секциих develop и instance/eggs в buildout.cfg:
develop =
src/Products.myproduct
...
[instance]
...
eggs =
${buildout:eggs}
${plone:eggs}
Products.myproduct
Запустите bin/buildout и у вас будет готовый к разработки продукт в директории src.
Возможно использовать пакеты вне пространство имен Products и одноименной директории. Много разработчиков предпочитают этот подход, для них неудобно хранить все в едином, "плоском" пространстве имен.
Для этого необходимы дополнительные шаги. До Zope 2.10.4 это также необходимо для продуктов в пространстве имен Products.
Мы должны добавить следующую директиву в configure.zcml пакета:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five">
<five:registerPackage package="." initialize=".initialize" />
</configure>
Далее, важна понимать, что пакеты вне пространства имен Products не определяются автоматически при старте Zope. Если они содержат файлы configure.zcml (для большинства пакетов это так), они должны быть явно подключены из других мест. Это может быть:
- configure.zcml другого пакета
- site.zcml, корень всех ZCML файлов, который находится в директории etc в корневом каталоге инстанса
- ZCML слаг, однострочный файл в etc/package-includes директории инстанса, с именем вида my.package-configure.zcml
Во всех случаях, синтаксис для подключения пакета один и тот же:
<include package="my.package" file="configure.zcml" />
Если у вас есть meta.zcml или overrides.zcml файлы, вы также можете добавить директивы <include /> для них. Если вы используете слаги, их имена должны быть соответствующие, например, my.package-meta.zcml или my.package-overrides.zcml. Слаг не может содержать больше одной строки.
Далее в руководстве, мы покажем как buildout может управлять слагами автоматически.

Предыдущий: Введение
