Начиная с Drupal 8.8.0 появились официальные Composer шаблоны для управления Drupal.
Основываясь на первом шаблоне (drupal/legacy-project) я и создавал свои первые сайты на D8 и писал курс про блог. Однако вскоре я перешел на более современный drupal/recommended-project. Но осталась одна проблема, мои проекты и сайты моих постоянных клиентов остались на legacy-project. Однажды я решил это дело исправить. Всем известный (среди Drupal разработчиков) Niklan писал статью как мигрировать на recommended-project, но у меня не вышло. Я решил пойти своим путем.
Для начала определимся что это за такие Composer шаблоны:
drupal/recommended-project – корень сайта вынесен на уровень ниже в папку web/ по умолчанию. Этот шаблон рекомендуется для всех новых проектов на Drupal 8 и 9. Примерно так:
project/
├─ web/
│ ├─ core/
│ ├─ libraries/
│ ├─ modules/
│ ├─ profiles/
│ ├─ themes/
│ └─ index.php
├─ vendor/
└─ composer.json
drupal/legacy-project – корень сайта находится в корне проекта, как в архивах. Так:
project/
├─ core/
├─ libraries/
├─ modules/
├─ profiles/
├─ themes/
├─ vendor/
├─ index.php
└─ composer.json
Скажем по простому – recommended-project лучше и быстрей. Не буду вдаваться в подробности, Niklan все описал прекрасно.
Теперь к делу. Что нам нужно сделать, чтобы мигрировать на современный шаблон? По сути нужно изменить composer.json, в частности заменить «drupal/core»: «^8.8.0», на новый «drupal/core-recommended»: «^8.8», и еще кое-какие мелочи, после чего запустить всем известный composer update. Но не пошло. Я сделал все по статье, миграция произошла, но сайт не открылся. Я пошел другим путем.
Я рассудил так – кто нам мешает создать рядом с папкой нашего сайта, допустим gavzav.name папку нового проекта, установить в него все те-же модули, которые были на старом сайте, после чего заменить тему, sites и т.д., запустить update. Все прошло на ура. Ошибок выявлено не было, сайт заработал на новом шаблоне. Сайтов клиентов у меня много, я создал для себя чеклист что за чем делать, чтобы не напортачить. Это самое я сегодня и выкладываю.
Для начала, если у вас виртуальный хостинг и нельзя указать папку сайта, то я пока не знаю что с этим делать. Ну и поехали.
1. Обновляем composer до версии 2. Если вы читали курс «Как создать блог на Drupal 9», то в курсе, что composer мы запускаем от пользователя, которые не root. Однако сам composer мы обновим от root,
composer self-update
а остальное будем делать уже от пользователя.
2. Внимательно смотрим нашу тему и модули. Проблемы у меня возникли с мобильным меню. Я раньше использовал mmenu, думал они таки сделают новую версию, но так и не сделали. Поэтому некоторые проекты я перевел на cheeseburger_menu, а он недавно обновился до 5 версии и приходится с ним работать практически с нуля. Только responsive_menu пока не подводит, на него я и перевел все проекты, чтобы дальше не было сюрпризов.
3. Удаляем ненужные модули и вообще все лишнее, включая библиотеки из папки library.
4. Допустим сайт у нас будет gavzav.name и такая же папка, которая лежит в var/www/gavzav.name/ Переходим в папку
cd /var/www
5. Создаем новый проект в папке gavzav
composer create-project --dev 'drupal/recommended-project:~8.9' gavzav
6. Копируем из папки gavzav.name в папку gavzav/web свои файлы типа favicon, логтипы, файлы подтверждения сайта и прочее что не касается Drupal. Туда же копируем модули из gavzav.name/modules/custom в папку gavzav/web/modules/custom. Папку /modules/contrib не трогаем. Копируем папки libraries, sites, themes, profiles в gavzav/web с заменой.
7. Готовимся устанавливать модули в новый сайт. Открываем composer.json и копируем оттуда все, из раздела «require», что начинается на drupal/ в текстовый редактор (кроме «drupal/core») в новый текстовый файл. Я использую Notepad ++. Получится у нас куча строк типа:
"drupal/admin_toolbar": "^2.0",
"drupal/advagg": "^4.0",
"drupal/antibot": "^1.2",
...
…
и т.д. Воспользуемся заменой и заменим по порядку то что в []
[ "] на [] (на ничего)
[": "] на [:]
[",] на [';]
[drupal/] на [composer require 'drupal/]
Строки у нас должны получиться такие
composer require 'drupal/admin_toolbar:^2.0';
composer require 'drupal/advagg:^4.0';
composer require 'drupal/antibot:^1.2';
...
т.е. готовые команды composer для установки модулей.
8. Идем в папку нового сайта
cd /var/www/gavzav
И запускаем установку модулей или по одному или все скопом из того, что у нас получилось на шаге 7.
9. Перенастраиваем файл хоста, у меня nginx, я поменял строку
root /var/www/gavzav.name;
на
root /var/www/gavzav/web;
т.е. на новую папку. Перезагружаем nginx или что там у вас.
10. Так как файлы из папки sites мы заменили, то база к новому сайту уже подключена. Мы просто идем в браузере по нашему привычному адресу и запускаем update – gavzav.name/update.php. В процессе обновления вам скажут что вы упустили. Например типа такого:
Это не страшно. У меня в одном проекте почему-то composer не записывал устанавливаемые модули. Просто устанавливаем недостающие модули и все.
11. Идем в Отчеты / Отчет о состоянии, Последние записи журнала и проверяем. У меня из больше чем 20 сайтов проблем не возникло.
12. Переименовываем папку gavzav.name в что угодно, например gavzav___name, а папку gavzav в gavzav.name. т.е. возвращаем новому сайту родную папку.
13.Изменяем обратно файл хоста
root /var/www/gavzav/web;
на
root /var/www/gavzav.name/web;
Перезагружаем nginx или что там у вас.
14. Когда будете уверены что все работает, удалите ненужную папку gavzav___name.
Готово.