Про перспективы MODX 3
Последние полгода работаю в голландской компании Sterc, в основном, с MODX 3, хотя и не собирался. Не то, чтобы мне это очень нравилось, но деньги платят отличные.
Sterc интенсивно проводит апгрейды своих клиентов на 3ю версию MODX, в ходе которых обнаружилась очень неприятная проблема, и это — Composer. Да-да, тот самый composer, который мы дружно в MODX запихивали, стал причиной больших проблем. Точнее, не он сам, а его реализация.

Несмотря на прикрученный composer, MODX 3 всё еще использует свой собственный формат дополнений. Более того, MODX не устанавливает composer.json по умолчанию, предлагая уже скачанную директорию core/vendor со всеми зависимостями.
Любое дополнение, которому тоже нужные какие-то зависимости, также притаскивает их с собой, в архиве. В момент инициализции ядра, система проходит по всем зарегистрированным namespaces и пытается подключить из них файл bootstrap.php, который загружает всё, ему нужное.
Установлено 10 дополнений — будет загружено 10 bootstrap.php, каждый из которых может подгрузить в систему свои зависимости. Чуете, чем попахивает?
Правильно — зависимости дополнений могут быть одинаковыми, но разных версий! Из-за того, что у вас нет одного общего composer.json, вы не можете разрулить зависимости. И если 2 пакета будут требовать, ну не знаю, nesbot/carbon или ramsey/uuid разных версий, один из них может поломаться, обращаясь к несуществующему методу.
Еще раз — 2 пакета требуют 1 зависимость, и загружают её по очереди, но разных версий. MODX никакой проверки не делает, и в любой момент ваш сайт может сломаться. Вы никак не можете это отследить и предупредить, о потенциальном конфликте никто не знает, пока он не произойдёт.
Лично я столкнулся с этим впервые, когда ядро MODX подключалось внутри очередей Laravel для всяких консольных дел, типа импорта больших данных. Это отлично работало на MODX 2, но после перехода на 3ку всё сломалось, потому что они оба загружали thephpleague/flysystem разных версий.
Именно для этого и нужен единый общий composer.json, чтобы проверить все требуемые версии и разобрать конфликты. Но у нас его в системе нет.
Или есть?
На самом деле любой пользователь MODX 3 может запросто скачать свежий composer.json из официального репозиторий и сделать composer update, чтобы обновить зависимости системы. Ничего не сломается, при условии, что зависимости от вашей версии MODX. Новый MODX обновлялся пока только 3 раза, не думаю, что там разные пакеты.
Ладно, обновились — а как это поможет в установке сторонних дополнений? А дополнения тоже должны устанавливаться через composer. Насколько я знаю, таких дополнений раньше просто не было. А пару дней назад появился первый пример — sterc/csp. Меня попросили написать пакет для управления заголовком Content-Security-Policy и особо не ограничивали, так что я придумал новый вид дополнений для MODX.
Установка через composer
Установка в CMS производится консольным скриптом, который идёт в комплекте:

Будут созданы нужные таблицы, прописан namespace, пукт меню и плагин. Удаление идёт почти теми же командами, но в обратную сторону:
Это всё. Никаких проблем с зависимостями (а если и будут — вы разрулите их до установки пакета), не нужно заходить в админку для установки\удаления, нет привязки к репозиторию MODX. Кликаем на GIFку внизу, чтобы увидеть саму работу дополнения.

Можно брать исходники и писать свои дополнения, там всё нарочно избыточно: и TypeScript с Vue 3, и полноценное API через Vesp, и модели Eloquent — можно делать любой функционал. По идее, тут можно написать еще несколько заметок «как именно этим разрабатывать», но мне пока лень.
Дальше всё зависит от вас. Или подобный формат дополнений приживётся, или MODX 3 будет нестабильным глючным куском кода, который можно сломать установкой новой версии дополнения в любой момент.
На мой взгляд очевидно, что старый формат транспортных пакетов дополнений в MODX 3 использовать нельзя, и всех нужно переводить на composer.
Ну а лично я дорабатываю последнюю неделю и увольняюсь, с MODX мне работать не нравится. Отдохну месяцок и продолжу заниматься развитием Vesp.
Sterc интенсивно проводит апгрейды своих клиентов на 3ю версию MODX, в ходе которых обнаружилась очень неприятная проблема, и это — Composer. Да-да, тот самый composer, который мы дружно в MODX запихивали, стал причиной больших проблем. Точнее, не он сам, а его реализация.

Несмотря на прикрученный composer, MODX 3 всё еще использует свой собственный формат дополнений. Более того, MODX не устанавливает composer.json по умолчанию, предлагая уже скачанную директорию core/vendor со всеми зависимостями.
Любое дополнение, которому тоже нужные какие-то зависимости, также притаскивает их с собой, в архиве. В момент инициализции ядра, система проходит по всем зарегистрированным namespaces и пытается подключить из них файл bootstrap.php, который загружает всё, ему нужное.
Установлено 10 дополнений — будет загружено 10 bootstrap.php, каждый из которых может подгрузить в систему свои зависимости. Чуете, чем попахивает?
Правильно — зависимости дополнений могут быть одинаковыми, но разных версий! Из-за того, что у вас нет одного общего composer.json, вы не можете разрулить зависимости. И если 2 пакета будут требовать, ну не знаю, nesbot/carbon или ramsey/uuid разных версий, один из них может поломаться, обращаясь к несуществующему методу.
Еще раз — 2 пакета требуют 1 зависимость, и загружают её по очереди, но разных версий. MODX никакой проверки не делает, и в любой момент ваш сайт может сломаться. Вы никак не можете это отследить и предупредить, о потенциальном конфликте никто не знает, пока он не произойдёт.
Лично я столкнулся с этим впервые, когда ядро MODX подключалось внутри очередей Laravel для всяких консольных дел, типа импорта больших данных. Это отлично работало на MODX 2, но после перехода на 3ку всё сломалось, потому что они оба загружали thephpleague/flysystem разных версий.
Именно для этого и нужен единый общий composer.json, чтобы проверить все требуемые версии и разобрать конфликты. Но у нас его в системе нет.
Или есть?
На самом деле любой пользователь MODX 3 может запросто скачать свежий composer.json из официального репозиторий и сделать composer update, чтобы обновить зависимости системы. Ничего не сломается, при условии, что зависимости от вашей версии MODX. Новый MODX обновлялся пока только 3 раза, не думаю, что там разные пакеты.
Ладно, обновились — а как это поможет в установке сторонних дополнений? А дополнения тоже должны устанавливаться через composer. Насколько я знаю, таких дополнений раньше просто не было. А пару дней назад появился первый пример — sterc/csp. Меня попросили написать пакет для управления заголовком Content-Security-Policy и особо не ограничивали, так что я придумал новый вид дополнений для MODX.
Установка через composer
composer require sterc/csp --with-all-dependenciesУстановка в CMS производится консольным скриптом, который идёт в комплекте:
composer exec sterc-csp install
Будут созданы нужные таблицы, прописан namespace, пукт меню и плагин. Удаление идёт почти теми же командами, но в обратную сторону:
composer exec sterc-csp remove
composer remove sterc/cspЭто всё. Никаких проблем с зависимостями (а если и будут — вы разрулите их до установки пакета), не нужно заходить в админку для установки\удаления, нет привязки к репозиторию MODX. Кликаем на GIFку внизу, чтобы увидеть саму работу дополнения.

Можно брать исходники и писать свои дополнения, там всё нарочно избыточно: и TypeScript с Vue 3, и полноценное API через Vesp, и модели Eloquent — можно делать любой функционал. По идее, тут можно написать еще несколько заметок «как именно этим разрабатывать», но мне пока лень.
Дальше всё зависит от вас. Или подобный формат дополнений приживётся, или MODX 3 будет нестабильным глючным куском кода, который можно сломать установкой новой версии дополнения в любой момент.
На мой взгляд очевидно, что старый формат транспортных пакетов дополнений в MODX 3 использовать нельзя, и всех нужно переводить на composer.
Ну а лично я дорабатываю последнюю неделю и увольняюсь, с MODX мне работать не нравится. Отдохну месяцок и продолжу заниматься развитием Vesp.
Комментарии: 24
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Очень надеюсь что формат приживется. А ещё надеюсь, получится сделать для этого формата дополнений GUI, чтобы его использование было также дружелюбно и к тем, кто с консолью обращается не часто… И дополнения «привычно» можно было ставить из админки.
Кажется, описанное в заметке решение — будущее дополнений для MODX3. Надеюсь, как минимум MODSTORE заинтересован в поддержке такого формата!
Ну или можно заплатить денег пакаджисту и публиковать там packagist.com/pricing
Вопрос в том, что аудитория MODX всячески сопротивляется подобным нововведениям, потому что это ж программированию учиться нужно, а они привыкли на коленке все собирать, чтобы хоть как-то работало, особо не вдаваясь в нюансы.
Ничего плохого в том, чтобы инструмент оставался простым, до определенного, конечно, предела, вовсе нет!
Все-таки composer это совсем не про программирование, а тоже инструмент, который в рамках MODX, мог бы, условно, мало чем отличаться от текущего менеджера пакетов с функционалом зависимостей.
Вон сделали же GUI modxminify чтобы не собирать вручную в коде бандлы как в minifyx. Я вот не пользуюсь им, но много где видел, и соглашусь что это блин удобно для проектов где не обязательно весь код держать под git-ом (А такие бывают? — бывают)))
Идея контролировать git-ом через composer.jsom даже версии установленных пакетов в систем мне лично очень нравится, но полностью отказываться от удобного GUI-менеджера пакетов навсегда, все-таки больше похоже на шаг назад. MODX не конкурирует с Laravel, в котором куча консольных инструментов и даже веб-сервер вроде как есть свой вместо nginx/apache, это давно ясно и ничего плохого в этом нет. А вот проигрывать в удобстве админки ещё и Wordpress было бы вообще печально.
Есть opencart, разрабатываемый американским разработчиком, есть отдельный (форк? не люблю я этот жаргон, скоро совсем уже нормальных слов не останется) — ocstore, который хоть и базируется на opencart но делается отдельными разработчиками, со своими модулями и дополнениями.
Потому что на MODX и в том виде, как сейчас есть, довольно комфортно работается… может не всем, как всегда :)
Да и новая версия недавно вышла, сейчас есть смысл развивать и адаптировать дополнения, чем и занимается в основном местное сообщество! И здесь с ocstore можно провести аналогию в том, что для minishop (который сам является дополнением к MODX) есть и появляются новые свои дополнения. И не только он, есть и другие компоненты, которые образуют свою экосистему, работая дополняя друг друга.
Предложенное автором поста решение актуально при использовании новой, альтернативной возможности подключать внешний код в MODX-проекты. Эта возможность встроена в движок с версии MODX3, но как следует из поста, имеет проблемы, которые к нашей всеобщей полагаю радости, при прямых руках и светлой голове, решаемые :)
А получившийся метод реализации как мне кажется, имеет больший потенциал т.к. вылился в некий альтернативный способ установки дополнений, основанный на развитом и популярном менеджере пакетов composer, который ещё даже не существовал или был в зародыше (судя по wiki), когда в MODX появился в текущем виде свой пакетный менеджер с установкой дополнений через админку.
В MODX 3 старый «стабильный» менеджер пакетов приводит к возможности добавить в систему конфликтующие дополнения. Как с самой системой, так и друг с другом.
Предложеный мною способ, наоборот, заставляет разруливать потенциальные проблемы на этапе установки дополнения в систему. Но для этого все устанавливаемые дополнения должны работать через composer.
Перечитай еще раз, если не понял, о чём я пишу.
Сейчас для MODX3 большинство дополнений как раз такие (т.к. адаптированы, но сделаны были для MODX2) поэтому проблема и не проявляется массово?
Я ещё перед тем как первый коммент написать, я проверил исходные коды популярных дополнений: FormIt, Minishop2, MIGX, pdoTools, ImageCropper, Formalicious, CKEditor Resizer и некоторых других и нигде нет bootstrap.php которые по 10 раз должны (или могли) бы загружаться, как описано в статье.
Может кто-нибудь привести примеры хотя бы 1 или лучше 2 дополнений, где есть автозагрузка через bootstrap.php, которые потенциально могут сломать друг друга? Мне тема показалась довольно серьезной, хочу проверить!
А так композерных пакетов внутри MODX с наличием composer.json сколько угодно. ZoomX, modRetailCRM, HibrydAuth навскидку
Если я правильно понял, самого факта того, что где-то в подпапках лежит конфиг composer.json и разработчик для обновления вендорных исходников вручную запускает composer, не достаточно, чтобы возникла возможность коллизии.
А чтобы эффект проявился, нужно чтобы пакет специально использовал в новом стиле composer:
Такие пакеты кто-нибудь встречал? Дайте ссылку плиз, я не могу найти
Теперь представь, что так может делать любое дополнение в MODX 3. Кто-то будет тестировать свой пакет на совместимость со всеми остальными в репозитории? Очень сомневаюсь.
А значит, с каждым новым дополнением, с каждой новой версией, с каждым месяцем у тебя всё больше шанс словить проблему.
Это есть и во 2й версии, просто там этот шанс гораздо ниже, но отнюдь не нулевой.
- pdoTools
- Collections
- Tagger
- SimpleSearch
- FormIt
- SeoSuite
- Formalicious
- GoogleAnalytics
- ModxDashboardWidgetsPack
- QRNFCGenerator
Это те, что на вскидку вспомнил, потому что работал с ними недавно. Если покопаться, найдутся еще.Ну теперь очевидно, что даже приведенный список пакетов означает актуальность уровня «уже» а не «скоро», как в начале показалось. И со временем будет расти…
Тогда получается, что одним best practice by Василий не обойтись, ведь родной менеджер пакетов всё ещё работает, и надо всё равно во встроенный механизм автозагрузки как-то добавлять проверку.
Беглый гуглинг показал, что не только с MODX 3 так бывает ¯\_(ツ)_/¯ например у движка Википедии похоже было подобное (ссылка ниже)
Но существуют решения (которые прямо сейчас в MODX конечно не поддерживаются):
• как встроенными средствами composer-а через специальный формат записи конфигурации ( stackoverflow )
• так и инструменты, помогающие это автоматизировать, например wikimedia/composer-merge-plugin
Наверное с эти уже пора отправляться с issue к MODX Core team, чтобы уточнить возможность прикрутить это, или нечто подобное к существующему механизму, если не для автоматизированного решения проблемы, то хотя бы для вывода предупреждений о конфликтах версий зависимостей при установке пакета… Или уже обсуждается, и я опять не осилил поиск на гитхабе?)))
В любом случае, ещё раз спасибо @Василий Наумкин и @Николай Савин за пояснения!
А 4-ю версию ждать в ближайшее время и правда не стоит, но Modx ещё поживёт.
А «такое себе занятие», в смысле что мало развлечения, «слишком» проверено и стабильно? Ну такой себе недостаток :)
На самом деле есть что улучшать и в двойке, и возможно некоторые фичи, которые попали в 3й релиз, вышли бы лучше для двойки (имхо), но так или иначе релизу 3 уже больше года, смысл говорить о 4 есть только в разрезе решения каких-то глобальных проблем, а даже описанные в статье косяки с composer возможно при исправлении потянут всё-таки на релиз минорной версии, т.к. в ряд ли обратная совместимость сломается от реализации проверки версий подключаемых пакетов…