Composer и Drupal: установка и обновление

Автор: Legenda , 21 октября 2025

Чтобы установить свою версию Composer на хостинг (для примера я взял Бегет), нужно выполнить несколько не сложных команд в консоли (у Бегет есть консоль прямо в панели управления). Создадим директорию для установки, если она ещё не создана:

mkdir -p ~/.local/bin

Теперь загрузим установщик в директорию выше:

wget https://getcomposer.org/installer -O ~/.local/composer-setup.php

и запустим установку Composer силами PHP, указав целевую директорию и имя файла:

php ~/.local/composer-setup.php --install-dir=$HOME/.local/bin --filename=composer

Файл-установщик нам больше не нужен, его можно удалить командой:

rm ~/.local/composer-setup.php

Composer установлен!

Некоторые команды для Composer

Чтобы запустить Composer от конкретной версии PHP, нужно выполнить запуск команды так (например, выведем текущую версию Composer, запустив его под PHP 8.0):

php8.0 ~/.local/bin/composer --version

В выводе консоли получим версию Composer и версию PHP, от которой его запустили.

Чтобы обновить Composer до последней версии, можно воспользоваться командой (запустим локально установленный Composer от того же PHP 8, т.к. написав просто composer мы запустим глобально установленный на хостинге Бегет Composer версии 1 под дефолтной версией PHP 5.6.40 на момент публикации заметки):

php8.0 ~/.local/bin/composer self-update

А чтобы обновить до конкретной версии, например, 2.2, нужно выполнить команду так:

php8.0 ~/.local/bin/composer self-update --2.2

При этом я, например, запустил эту команду, имея Compaser версии 2.8.12, а вывод консоли был следующим:

Storing "2.2" as default update channel for the next self-update run.
Warning: You forced the install of 2.2.25 via --2.2, but 2.8.12 is the latest stable version. Updating to it via composer self-update --stable is recommended.
Upgrading to version 2.2.25 (2.2.x channel).
Use composer self-update --rollback to return to version 2.8.12

Это означает, что мы переключились на канал обновлений ветки 2.2, и был установлен Composer версии 2.2.25. Также нас предупредили, что это не последняя стабильная версия версия, и дабы на неё переключиться нужно ввести команду:

composer self-update --stable

Последней строкой нам сообщили, что для возврата к предыдущей установленной версии (в моём случае это версия 2.8.12) нужно ввести команду:

composer self-update --rollback

Не забываем добавлять вначале версию PHP и путь до исполняемого файла Composer (у меня, например, это php8.0 ~/.local/bin/composer).

Установка и удаление Drush

Если необходим Drush, то его можно установить командой:

composer require drush/drush

А если нужно удалить его, то воспользуемся командой:

composer remove drush/drush

Как видим, установка и удаление выполняем через Composer. Не забываем добавлять вначале версию PHP и путь до исполняемого файла Composer.

Обновление Drupal 8 до 9 через Composer

До версии 8 Drupal можно было установить на сайт путём распаковки архива с официального сайта. Начиная с версии 9 (может, и в последних обновлениях версии 8 — тоже) для обновления или установки требуется использовать Composer.

Помимо метода обновления/установки претерпела изменения структура папок движка. Чтобы перевести сайт на новые рельсы, можно воспользоваться модулем Composerize (GitHub). Он может сгенерировать "composer.json" из установленной кодовой базы установленного Drupal, запустив composer install. Но в этом случае структура папок останется прежней. Чтобы у нас появилась новая структура, нужно сделать новую установку и перенести в неё некоторые старые файлы/настройки и, конечно, подключить к ней старую базу данных. Для этого воспользуемся инструкцией с drupal.org, но установим не последнюю версию движка, а ту же самую, что сейчас установлена у нас. Будем обновляться поэтапно, и сначала займёмся структурой папок и Composer.

Чтобы освежить в памяти, какая версия Drupal сейчас установлена, можно зайти: Управление — Отчёты — Отчёт о состоянии. Предположим, что сейчас движок установлен по адресу my-site/public_html. Public_html является рабочим каталогом сайта, который виден из интернета. Согласно новой структуре, таковой директорией будет являться папка web. Мы сделаем на неё симлинк, чтобы не менять настройки на хостинге. Перейдём в каталог нашего сайта:

cd ~/my-site

Установим заново движок Drupal нашей версии (допустим, 8.9.20) в директорию "drupal" на уровень выше (не видной из интернета) следующей командой (текущий сайт работать не перестанет, мы его пока не трогаем):

php7.4 ~/.local/bin/composer create-project drupal/recommended-project:8.9.20 drupal

Конечно, мы должны были делать установку в папку "my-site" вместо "drupal", перейдя в корневой каталог сервера (на уровень выше) и выполнив команду:

php7.4 ~/.local/bin/composer create-project drupal/recommended-project:8.9.20 my-site

но мы уже в папке "my-site", и она не пустая (есть папка "public_html"), а в этом случае Composer выдаст, что каталог не пуст и не установит движок. (Кстати, чтобы выполнить установку прямо в текущую директорию, надо вместо имени папки написать просто точку.) Поэтому мы установили Drupal в поддиректорию, и теперь надо все файлы переместить в нашу директорию "my-site" (рядом с "public_html").

Файлы готовы. Начнём переносить настройки нашего старого сайта. Нам надо скопировать все модули, темы, библиотеки из папки старой установки (public_html) в новую, а пути их расположения мы найдём в файле composer.json, в секции "installer-paths". Также необходимо скопировать файлы загрузки из /public_html/sites/default/files/ в новую установку по адресу /web/sites/default/files/. Удалим временные файлы, такие как php/, js/, и css/ из папки /web/sites/default/files. Они пересоздадутся заново, можно не беспокоиться.

Теперь займёмся переносом необходимых параметров в файле settings.php, что лежит в /sites/default/. Можно открыть оба файла (в новой установке файл берём из заготовки "default.settings.php") и сравнивая, переносить параметры. Особый акцент сделаем на таких строках, как:

$databases['default']['default']

$settings['hash_salt']

$settings['trusted_host_patterns']

$config_directories['sync']

Потом вносим в файл конфигурации информацию обо всех установленных модулях (см. инструкцию по ссылке в начале этого блока).

Теперь переименовываем папку "public_html", делаем симлинк на папку "web" командой:

ln -s web public_html

и обновляем базу данных, перейдя в браузере по адресу my-site.ru/update.php. И чистим кэш через админку "Управление — Конфигурация — Разработка — Производительность" (команды для Drush: "drush updatedb" и "drush cache:rebuild", но у меня он не установлен ещё).

Всё, сайт должен работать, можно удалять переименованную папку и продолжать обновление Drupal через Composer!

Обновляться дальше будем поэтапно. Сначала обновимся до Drupal 9.0.0. Вводим команду:

php7.4 ~/.local/bin/composer require drupal/core-recommended:9.0.0 drupal/core-composer-scaffold:9.0.0 drupal/core-project-message:9.0.0 --update-with-all-dependencies

После этого заходим по адресу my-site.ru/update.php и видим ошибку в конфигурации settings.php. Открываем файл и меняем параметр

$config_directories['sync'] = 'путь/до/папки/sync';

на

$settings['config_sync_directory'] = 'путь/до/папки/sync';

Завершаем обновление базы данных и чистим кэш в админке (Управление — Конфигурация — Разработка — Производительность).

Далее обновляемся до последней версии Drupal — 9.5.11:

php7.4 ~/.local/bin/composer require drupal/core-recommended:9.5.11 drupal/core-composer-scaffold:9.5.11 drupal/core-project-message:9.5.11 --update-with-all-dependencies

Обновляем версию PHP до 8.1 (иначе во время обновления БД выскочит предупреждение о несоответствии версии PHP), обновляем базу данных и чистим кэш. Проблем быть не должно.

Обновление Drupal 9.5.11 до 10.0.0

С переходом на версию 10 важных нюансов значительно больше! Вот довольно подробная статья на Drupal.org, а здесь я кратко опишу важные моменты.

Если обходиться базовыми возможностями движка, то в помощь нам страница "Отчёт о состоянии" (Управление — Отчёты — Отчёт о состоянии). Смотрим жёлтые предупреждения, да и вообще, исправляем все ошибки.

Темы. Нужно перейти на актуальные темы оформления сайта и административной панели, т.к. после обновления до 10 они будут отключены, и сайт может не отобразиться вовсе. Можно воспользоваться стандартными темами "Olivero" для сайта и "Claro" для админ-панели. После перехода на них удаляем устаревшие темы.

Расширения (модули). Очень важно перейти с CKEditor 4 на CKEditor 5, так как старый редактор будет удалён! Сначала включаем CKEditor 5 (Управление — Расширения), потом идём на страницу "Текстовые форматы и редакторы" (Управление — Конфигурация — Работа с содержимым). Тут везде, где в столбце "Редактор" указано "CKEditor", жмём "редактировать" и меняем редактор в выпадающем списке на "CKEditor 5", сохраняем. Повторяем отдельно для каждой строки. После чего возвращаемся в "Расширения" и спокойно удаляем устаревший CKEditor (CKEditor 4).

Продолжаем изучать отчёт о состоянии и удаляем остальные устаревшие модули. Они даны ссылками, где можно ознакомиться с информацией и решить, что делать дальше (просто удалить или заменить на аналог/добавить модуль вручную).

Проверяем системные требования к серверу и базе данных. Минимальный PHP теперь 8.1, MySQL — 5.7.8. См. остальные параметры по ссылке в начале раздела.

Проверяем версию Composer. Drupal 10 желает версию 2.3.6 или новее. Установить конкретную версию можно командой:

composer self-update 2.3.6

(не забываем добавлять версию PHP и путь до Composer, если требуется).

Так же можно проверить несколько команд по интеграции Composer 2.2 и новее с плагинами. Честно, не совсем понял, что это (см. раздел "Composer integration changes" по ссылке в начале), но команды такие:

composer config --no-plugins "allow-plugins.composer/installers" true
composer config --no-plugins "allow.plugins.drupal/core-composer-scaffold" true
composer config --no-plugins "allow-plugins.drupal/core-vendor-hardening" true
composer config --no-plugins "allow-plugins.drupal/core-project-message" true

Опять же, не забываем указывать версию PHP и путь до Composer, если надо.

Теперь, когда все проблемы решены, версия Composer 2.3.6 или выше, сервер удовлетворяет минимальным требованиям, можно приступить к обновлению ядра Drupal до версии 10.0.0:

composer require drupal/core-recommended:10.0.0 drupal/core-composer-scaffold:10.0.0 drupal/core-project-message:10.0.0 --update-with-all-dependencies

Здесь мы явно указали именно версию 10.0.0. Будем идти по ступенькам, поэтапно.

Drupal 10.2.12

Следующий релиз, на который я решил перейти, 10.2.12, т.е. прямо перед 10.3, вместе с которым вышел Drupal 11.0.0. На странице релиза 10.2.0 указано, что минимальная версия PHP теперь 8.2, и начата поддержка 8.3. А на странице релиза 10.3.0 заявлена полная поддержка PHP 8.3, и она же является рекомендуемой. Так что выставляем PHP 8.2 и обновляемся до крайней минорной версии 10.2.х:

composer require drupal/core-recommended:~10.2.0 drupal/core-composer-scaffold:~10.2.0 drupal/core-project-message:~10.2.0 --update-with-all-dependencies

После обновления и запуска update.php я увидел страницу без стилей. Но страница вполне работоспособная и обновить БД удалось (после чего стили вернулись). Чистим кэш, смотрим "отчёт о состоянии".

Там я обнаружил одно предупреждение: "Буферизация вывода — Буферизация вывода выключена. Это может снизить быстродействие Drupal. Вы можете включить буферизацию по умолчанию в настройках PHP." Оставлю пока эту ошибку, она не критичная. Постараюсь исправить её позже.

Drupal 10.3.14

Обновляем Composer до актуальной версии (в моём случае это версия 2.8.12):

php8.3 ~/.local/bin/composer self-update --stable

После чего обновляем движок до последний версии в ветке 10.3.х:

php8.3 ~/.local/bin/composer require drupal/core-recommended:~10.3.0 drupal/core-composer-scaffold:~10.3.0 drupal/core-project-message:~10.3.0 --update-with-all-dependencies

Обновляем базу данных (например, зайдя на /update.php), чистим кэш, идём в "отчёт о состоянии". Я там увидел ещё одно предупрежднение: "State cache flag not set — State cache flag $settings['state_cache'] is not set. It is recommended to be set to TRUE in settings.php unless there are too many state keys. Drupal 11 will default to having state cache enabled.". С этим тоже пока делать ничего не буду, т.к. в Drupal 11 это должны закрепить уже.

Попробуем обновиться до 11.0.x, перепрыгнув остальные версии 10.х? Думаю, должно получиться, т.к. 11.0.0 вышла вместе с 10.3.0.

Drupal 11.0.13 — 11.2.7

Для начала обновим MySQL до версии 8.0, т.к. Drupal 10 хоть и хочет версию 8, но всё ещё работает с MySQL 5.7, а вот Drupal 11 после обновления движка и запуска обновления БД не сдвинется с места, пока MySQL не повысить до 8.

Обновили MySQL? Обновляем Drupal командой:

php8.3 ~/.local/bin/composer require drupal/core-recommended:~11.0.0 drupal/core-composer-scaffold:~11.0.0 drupal/core-project-message:~11.0.0 --update-with-all-dependencies

Обновляем базу данных, чистим кэш. Обновляемся до ветви 11.1.х:

php8.3 ~/.local/bin/composer require drupal/core-recommended:~11.1.0 drupal/core-composer-scaffold:~11.1.0 drupal/core-project-message:~11.1.0 --update-with-all-dependencies

Обновляем базу данных, чистим кэш. Обновляемся до ветви 11.2.х. Она же крайняя на текущий момент, поэтому дадим команду на обновление всей мажорной версии:

php8.3 ~/.local/bin/composer require drupal/core-recommended:^11 drupal/core-composer-scaffold:^11 drupal/core-project-message:^11 --update-with-all-dependencies

Обновляем базу данных, чистим кэш, обновляем переводы.

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

php8.3 ~/.local/bin/composer update "drupal/core-*" --with-all-dependencies

 

Далее предстоит работа над предупреждениями, вылезшими во время поэтапного обновления движка.

Комментарии