Битрикс подружился с 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
Комментарии
Отправить комментарий