Вы здесь

Установка Drupal Commerce 2.x без Composer, с Ludwig

Средний сайт на Drupal Commerce зависит от многих внешних PHP-библиотек. Drupal Commerce нуждается в ommerceguys/intl, Address нуждается в commerceguys/addressing, GeoIP нуждается в geoip2/geoip2, Search API Solr нуждается в solarium/solarium. Каждому платёжному шлюзу нужен соответствующий SDK. Все эти библиотеки нужно скачать отдельно, потому что ограничения лицензий не позволяют сохранять их код на drupal.org. В течении последних 5 лет основным путём скачивания и использования PHP-библиотек был Composer, инструмент командной строки.

Composer работает на основе проектов, что означает, что каждая установка Друпала имеет одну папку для всех требующихся PHP-библиотек, вне зависимости от того какому модулю она требуется. Это позволяет Composer обнаруживать и предотвращать возможные конфликты, вроде несовместимости версий библиотеки. Composer также рекурсивно получает зависимости, автоматически устанавливая и обновляя пакеты, которые требуются для других пакетов. Это большое преимущество для управляющего сайтом в сравнении с предыдущим инструментом Drush Make. Но опора на автозагрузчик сгенерированный Composer, делает невозможной самостоятельное скачивание библиотек, что делает Composer плохим выбором.

Когда 2,5 года назад мы начали разработку Drupal Commerce 2.x, наша инструкция по установке выглядела так:

Вскоре мы поняли, что Composer требуется в любом случае, мы можем использовать его и для скачивания самого Drupal Commerce, положившись на указание его зависимостей от других модулей и библиотек. После многолетних усилий сообщества, изменений в ядре Друпала и на drupal.org, наша идея стала возможной! Наша инструкция по установке сегодня выглядит как одна команда, с помощью которой автоматически скачиваются все необходимые модули и библиотеки:

  • composer require drupal/commerce ~2.0

Одна команда нужна и для обновления Drupal Commerce со всеми его зависимостями:

  • composer update drupal/commerce --with-dependencies

Обновление ядра Друпала выполняется аналогичным образом. Патчи можно применять как к основным, так и к дополнительным модулям, просто перечислив их в корневом файле composer.json. Это дало нам беспрецедентную силу и простоту для нас, но счастливы были не все.

Жалобы на Composer

Первые жалобы на Composer касались его скорости и использования памяти, но с тех пор ситуация с этими вопросами значительно улучшилась. Другой распространённой жалобой было отсутствие поддержки Composer на общих хостингах, что фактически является неправильным пониманием идеи о том, что Composer должен запускаться на сервере, а не локальной машине с полной базой кода загружаемой на сервер. Но есть две проблемы, которые исправить не просто:

  • Использование Composer для скачивания проекта целиком, в Китае может занять целый час из-за того, что большинство CDN заблокированы и разработчики вынуждены использовать прокси
  • Многие люди радикально против изучения работы в командной строке

Проблема с командной строкой усугубляется тем, что Composer относится к пользователю не слишком дружелюбно — его запуск в неправильной папке или с некорректными параметрами может привести к скрытым и загадочным для пользователя ошибкам. Кроме того, пакет ядра Друпала хуже подходит для использования с Composer, чем проект Drupal Composer (или наша собственная Project Base), потому что он не поддерживает исправления или обновления ядра без правки composer.json. Проблема обновления ядра Друпала особенно важна, так как самостоятельное обновление ядра приведёт к сбоям в работе сайта (так как люди заменяют папку vendor другой, которая не содержит только зависимости ядра).

Мы считаем, что правильным решением проблемы дружлюбности к пользователю было бы создание Composer GUI, возможно оптимизированного под Друпал. Мы сделали Conductor, приложение для Electron, как концепции такого подхода, но он не получил большой поддержки от сообщества. Причина проста: разработчики, которые могут внести свой вклад, уже являются пользователями командной строки. У нас нет необходимых ресурсов для разработки и поддержки такого инструмента. Нам нужен был временный пластырь.

Ludwig

Многие люди спрашивали — Разве я не могу просто скачать библиотеки в папку модуля и как-то добавить их в класс автозагрузки? Мы попытались сделать это, но потерпели неудачу, потому что не смогли хукнуть автозагрузчик достаточно рано. На прошлой недели мы наткнулись на магическое заклинание, которое позволило нам это сделать. Так родился Ludwig.

Вот как он работает. Модуль определяет файл ludwig.json, в котором перечислены зависимости модуля:

{
  "require": {
    "doctrine/collections": {
      "version" : "v1.4.0",
      "url": "https://github.com/doctrine/collections/archive/v1.4.0.zip"
    },
    "commerceguys/enum": {
      "version" : "v1.0",
      "url": "https://github.com/commerceguys/enum/archive/v1.0.zip"
    },
    "commerceguys/addressing": {
      "version" : "v1.0.0-beta3",
      "url": "https://github.com/commerceguys/addressing/archive/v1.0.0-beta3.zip"
    }
  }
}

Этот список также должен включать зависимости библиотек. В нашем пример первые две библиотеки требуются для commerceguys/addressing.

Управляющий сайтом скачивает и устанавливает Ludwig, потом скачивает модули (но не устанавливает их). Можно перейти на страницу admin/reports/packages и увидеть их статус:

Установка Drupal Commerce 2.x без Composer, с Ludwig

На странице пакетов можно найти ссылку для каждой отсутствующей библиотеки и путь, по которому она должна находиться на сайте. Управляющий сайтом может скачать библиотеки и очистить кеш, чтобы сделать их доступными.

Если управляющий сайтом хочет избежать использования Composer, но не боится командной строки, то он может сделать всё из консоли с помощью одной команды:

Установка Drupal Commerce 2.x без Composer, с Ludwig

Это позволит скачать отсутствующие библиотеки автоматически.

Таким образом, инструкция по установке Drupal Commerce с использованием Ludwig становится такой:

Больно станет, когда придёт время обновить Drupal Commerce, так как все 7 модулей и нужные им библиотеки придётся скачать самостоятельно снова. При использовании Drush или Drupal Console процесс проходит безболезненно, но если всё делать самостоятельно, то процесс затягивается. Управляющему сайтом нужно быть осторожным с комбинированием модулей зависящих от внешних библиотек, потому что нет защиты от использования библиотек несовместимых версий или перекрывающихся требований.

Последние замечания

Вам понадобятся -dev-версии модулей Drupal Commerce и Address, чтобы всё работало. Другие модули (такие как шлюзы платёжных систем) ещё не были обновлены файлами ludwig.json. Документация по Drupal Commerce будет обновлена в ближайшее время, а Composer по-прежнему останется рекомендуемым способом установки и поддержки сайта.

Рубрика: