[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