Найти - Пользователи
Полная версия: Рекурсивный поиск зависимостей в z3c.autioinclude
Начало » Zope/Plone/Bluebream » Рекурсивный поиск зависимостей в z3c.autioinclude
1 2
Cykooz
Вот на этой страничке https://bugs.launchpad.net/grok/+bug/713683/comments/1, в конце, написано, что z3c.autoinclude выполняет рекурсивный поиск зависимостей (т.е. находит зависимости зависимостей и т.д.). Но у меня на практике почему то этого не происходит. Посмотрев код z3c.autoinclude я не обнаружил там какой либо рекурсии. Если нет рекурсивного поиска, то пользы от этого пакета становится в два раза меньше, т.к. придётся либо отказаться от него и подключать все нужные zcml ручками, либо прописывать в зависимостях основного приложения абсолютно все зависимости.
Может я ошибаюсь насчёт отсутствия рекурсивного поиска и он всё таки есть в z3c.autoinclude, но почему тогда у меня он не работает?
Cykooz
Нашёл в сырной лавке пакет tl.eggdeps, который умеет рекурсивно находить все зависимости.
Попробую препарировать его и сделать свой форк z3c.autoinclude.
astoon
z3c.autoinclude сильно увеличивает время старта. Cykooz, ты случаем не видел в нем, почему так и можно ли это исправить? По этой причине я в свое время отказался от его использования…
Cykooz
astoon
ты случаем не видел в нем, почему так и можно ли это исправить
Видел. Там самая медленная функция - это поиск по текстовому названию модуля его дистрибутива (egg).
Исправить можно. Например сделав кеширование всех инклудов в файл auto_configure.zcml. В коментариях (или отдельном файле) сохранять информацию для отслеживания изменений в пакетах, думаю в случае с билдаутом достаточно будет использовать для этого содержимое sys.path и список прямых зависимостей.
Для начала прикручу рекурсивный поиск зависимостей. Если всё будет нормально, то займусь кешированием.

Кстати, насчёт той ссылки из начала темы, дело в том, что z3c.autoinclude используется в Grok из коробки. Но там, как я понял, принято в конфиги всех модулей вставлять автоматическое подключение зависимостей. Поэтому видимо у Uli Fouquet и сложилось мнение, что z3c.autoinclude делает рекурсивный поиск.
Cykooz
Есть ещё одна идея для замены z3c.autoinclude - рецепт для билдаута, который создаёт zcml с инклудами зависимостей. Но это это я пока оставлю как идею. Надо проект делать, некогда плодить похожие сущности.
Cykooz
Поизучал tl.eggdeps - надо сказать он находит все зависимости практически мгновенно. При такой скорости возможно даже не понадобится кеширование для z3c.autoinclude.
Cykooz
Закопавшись в проблему по уши я понял, что в данный момент не знаю как ускорить работу модуля z3c.autoinclude без использования кеширования. Т.к. основные тормоза заключаются в поиске правильного дистрибутива (с учётом наличия namespace-ов) для объекта типа module.
Функция поиска вызывается один раз для того, что бы получить дистрибутив модуля указанного в zcml директиве includeDependencies. Но и этого одного раза вполне достаточно, что бы замедлить запуск приложения.
Cykooz
В общем я запилил рекурсивный поиск зависимостей и добавил атрибут ignore для указания списка пакетов, конфиги которых не надо подключать. Пример использования:
<includeDependencies
package="."
recursive="True"
ignore="zope.app.zcmlfiles ice.control"
/>
Стоит отметить, что ignore позволяет исключить конфиги только указанных пакетов, но не их зависимостей.
Если кому то интересно то код можно слить тут:
https://bitbucket.org/cykooz/z3c.autoinclude
astoon
Круто. В англоязычной рассылке скинуть бы тоже надо инфу.
Cykooz
Судя по TODO, автор пакета и сам хотел сделать рекурсивный поиск, но как я понял в виде какой то отдельной директивы.
Попробую запостить сообщение в zope-dev, надеюсь там поймут мой недоанглийский.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB