Битрикс подружился с composer

В Битриксе с версии 18.0.5 официально используется composer. Есть даже страница документации. Многие проекты уже давно применяют composer и сделано у всех это как-то по своему. Я имею ввиду расположение конфига самого composer и каталога с библиотеками (vendor). Тут опишу пошагово, как привести применение composer на проекте к официальным рекомендациям: ведь хорошо же, когда на разных проектах всё устроено единообразно, безопасно и понятно. Описание заточено под боевой сайт, но сначала, конечно, стоит всё это проделать на тестовом сайте.

Перенос за пределы сайта

Если composer уже где-то задействован, и он не за пределами DOCUMENT_ROOT, - переносим (сначала копированием; оставляем старые файлы на месте) за пределы DOCUMENT_ROOT файлы composer.json, composer.lock и скрипт composer, если он используется локальный, а не системный глобальный. Старые файлы пока оставляем на месте, чтобы не валились ошибки при переключении сайта с одного расположения библиотек на другое (opcache будет некоторое время "видеть" старые библиотеки). Это важно для боевого сайта, где нежелателен простой сайта даже на несколько секунд.

Настроки в битриксе

В настройках bitrix/.settings.php прописываем абсолютный путь до конфига composer:

'composer' => [
  'value' => [
    'config_path' => '/home/oleg/vhosts/project1/www/composer.json'
  ]
],

Тут подразумевается такое расположение сайтов и файлов на одном ядре битрикса (многосайтовость):

/home/oleg/vhosts/project1/www$ tree -L 1
.
├── composer
├── composer.json
├── composer.lock
├── site.ru
├── site1.ru
├── site2.ru
└── vendor

Внутри каждого из каталогов сайтов (site1.ru, site2.ru) находятся уже сами файлы сайтов и симлинки на каталоги bitrix и upload из "основного" сайта site.ru

Добавляем в собственный конфиг composer ещё и конфиг от битрикса. Для этого в composer.json в секцию require добавляем строку:

"wikimedia/composer-merge-plugin": "dev-master",

И в секцию extra добавляем блок с относительным путём к битриксовому конфигу:

"merge-plugin": {
  "require": [
    "site.ru/bitrix/composer-bx.json"
  ]
}

Установка библиотек

На новом месте composer'а нужно по новой установить все зависимости (можно было бы просто перетащить старый каталог vendor, но новая установка - более правильный путь, позволит вскрыть на раннем этапе какие-то проблемы, если они есть).

Пример для локальной утилиты composer из каталога, где лежит composer.json:

php -f ./composer install --classmap-authoritative

Использование install позволяет установить именно те версии, которые были зафиксированы в файле composer.lock при последнем обновлении зависимостей. А опция --classmap-authoritative рекомендуется для оптимизации быстродействия при дальнейшем использовании подключаемых библиотек. Я выполнил такую команду и словил ошибку:

[ErrorException]
"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

Это как раз и выявило первую проблему. Моя локальная утилита composer сильно устарела и требует обновления. Для обновления выполняем:

php -f ./composer self-update

И тут я словил вторую ошибку:

[RuntimeException]
SHA384 is not supported by your openssl extension, could not verify the phar file integrity

В обсуждении проблемы предложено полностью переустановить утилиту composer:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php --filename=composer
php -r "unlink('composer-setup.php');"

После переустановки composer локально, опять запустил:

php -f ./composer install --classmap-authoritative

Для игнорирования расширений или версии PHP нужно в команду добавить опцию: --ignore-platform-reqs (полезно, если вы на тестовом сервере и вам не нужны все расширения PHP из опций «ext-» блока require).

Если нужно, можно заодно обновить зависимости:

php -f ./composer update --classmap-authoritative

После install или update выполняем:

php -f ./composer dump-autoload --classmap-authoritative

Бонус от разработчиков битрикса

Как бонус теперь становится доступной возможность создать файлы аннотаций на машине разработчика (на боевом сайте делать не нужно!):

php bitrix.php orm:annotate

Это позволит увидеть автодополнение в среде разработки по ядру битрикса. Но у меня команда падала с ошибкой «PHP Error: Class 'IRestService' not found in» - решилось установкой модуля REST API в управлении модулями битрикса (на боевом сайте делать, только если это реально надо!).

Завершающий этап

После переключения кода на использование нового файла composer, можно удалять старый каталог vendor и старые файлы composer.json и composer.lock

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа