понедельник, 11 апреля 2011 г.

Автоматическое подключение зависимостей в BlueBream

Всерьёз занявшись разработкой проекта с использованием BlueBream я столкнулся с одним существенным неудобством. В конфигурационном файле приложения необходимо было подключить конфигурации всех компонентов, которые я использую. Под словом "всех" я понимаю не только те компоненты функционал которых я использую непосредственно, но и те от которых зависят первые. А это уже не менее сотни компонентов и уследить за ними всеми не так просто - очень легко допустить ошибку. Ну и сам факт того, что один и тот же пакет надо подключать к проекту в двух местах (в setup.py и configure.zcml) тоже увеличивает шанс появления ошибок.

Для решения этой проблемы предназначен специальный пакет z3c.autoinclude. Он позволяет, используя специальные zcml директивы, подключать конфигурационные файлы зависимостей пакета. Но на данный момент в этом пакете есть несколько существенных недостатков:
  • он находит только непосредственные зависимости пакета и не ищет зависимости зависимостей
  • заметное замедление запуска приложения
Первая проблема частично решается если каждый пакет будет использовать в своём конфигурационном файле директиву для подключения зависимостей. Именно так и сделано в фреймворке Grok. В нём z3c.autoinclude используется из коробки.
Но кроме Grok я больше не видел модулей, которые использовали бы z3c.autoinclude. Поэтому я решил доделать рекурсивный поиск зависимостей (судя по TODO автор и сам хотел сделать что то подобное но так и  не сделал). Заодно я сделал кеширование полученого результата в zcml файл, что позволяло решить вторую проблему. Я форкнул проект и выложил исходники в публичном репозитории https://bitbucket.org/cykooz/z3c.autoinclude
Я расширил стандартные директивы includeDependencies и includeDependenciesOverrides дополнительными необязательными атрибутами:
recursive - указывает на необходимость рекурсивного поиска зависимостей, по умолчанию False;
ignore - список пакетов, которые не нужно подключать. Стоит отметить, что ignore позволяет исключить конфиги только указанных пакетов, но не их зависимостей. Так же можно исключить все пакеты из заданного namespace-а, для этого надо указать его имя с точкой на конце.
cachefile - путь к zcml файлу, в котором будет сохранён результат работы директивы с целью увеличения скорости последующих запусков.
Полный пример использования этих атрибутов:
<includeDependencies
    package="."
    recursive="True"
    ignore="zope.app. ice.control"
    cachefile="auto_configure.zcml"
/>

Комментариев нет:

Отправить комментарий