[Python-devel] Касательно зависимостей в продуктах Zope

Alexey Morozov =?iso-8859-1?q?morozov_=CE=C1_gorodok=2Enet?=
Чт Июн 16 09:47:42 MSD 2005


Господа, налицо проблема/противоречие.

Мы, вероятно, хотим, чтобы пакеты-продукты Zope содержали в себе
адекватный список RPM-зависимостей, так, чтобы выбор некоего пакета
приводил с необходимостью к установке всех остальных, требуемых для
работы данного продукта. Зависимости эти хочется считать автоматически,
благо, у нас есть такая замечательная считалка.

Проблем на этом пути несколько.

Первый - это то, что в обычном состоянии путь
/usr/lib/zope/lib/python/Products, куда обычно укладываются продукты для
Zope, отсутствует в стандартных путях для питоновских модулей, и,
соответственно, при подсчете provides модули оттуда игнорируются. На это
есть замечательный макрос %add_python_lib_path, который позволяет
добавить еще один путь
в список просматриваемых python.prov.py. Таким образом во все спеки
продуктов Zope имеет смысл добавлять нечто вроде

%add_python_lib_path         /usr/lib/zope/lib/python/Products/

(или, с учетом того, что данный путь указан в %prefix):

%add_python_lib_path  %prefix

На первый взгляд, это решает проблему, в списке provides появляются
необходимые питон-модули, соответствующие продуктам. Вот как выглядит
начало списка provides для (пересобранного) CMF:

python2.4(CMFCore)
python2.4(CMFCore.ActionInformation)
python2.4(CMFCore.ActionProviderBase)
python2.4(CMFCore.ActionsTool)
python2.4(CMFCore.CMFCatalogAware)
python2.4(CMFCore.CMFCorePermissions)
python2.4(CMFCore.CachingPolicyManager)
python2.4(CMFCore.CatalogTool)

Казалось бы, все неплохо, однако есть, на самом деле, некоторая
неувязка. Дело в том, что при импорте продуктов, в sys.path загружаемого
продукта попадает не /usr/lib/zope/lib/python/Products/, а всего лишь
/usr/lib/zope/lib/python/. Таким образом, продукт, желающий
воспользоваться функциональностью другого продукта, импортит этот
продукт не так:

from AnotherProduct import something

а так

from Products.AnotherProduct import something

Это создает для нас следующую проблему. В список Requires попадает не
AnotherProduct, а просто Products, т.к. по умолчанию искалка
зависимостей берет только верхнеуровневый модуль. Очевидно, что пользы
от такой зависимости - 0, т.к. pythonX.Y(Products) предоставляется,
вообще-то Zope-Modules.

Возможных выхода два.

Первый, хакерский, это заменить

from Products.AnotherModule import ...

на

from AnotherModule import...

и провести аналогичную замену для случая import
Products.AnotherModule.... Однако, очевидно, это требует патча на
Zope'овый загрузчик продуктов, который бы добавлял
/usr/lib/zope/lib/python/Products в список путей.

Второй - это использовать иерархический поиск зависимостей при помощи
макроса

%python_req_hier

_И_ перенести "точку отсчета" для продуктов Zope из
/usr/lib/zope/lib/python/Products в /usr/lib/zope/lib/python/
Перенесение точки отсчета потребует, в частности, создания (пустого)
файла %buildroot/usr/lib/zope/lib/python/Products/__init__.py. Ну и
уверенности в 100%-корректности %python_req_hier у меня нет.

первый способ - очевидно проще, но неаккуратнее с точки зрения
соответствия исходников и содержимого пакетов. Второй - менее intrusive,
но решение заметно более громоздкое :-(

АМ.



Подробная информация о списке рассылки python-devel