Миграция с drupal-project на recommended-project. Готовимся к Drupal 9

С того момента, когда я написал свой курс "Как создать блог на Drupal 8" много воды утекло. В частности, начиная с Drupal 8.8.0 появились официальные Composer шаблоны для управления Drupal.

Основываясь на первом шаблоне (drupal/legacy-project) я и создавал свои первые сайты на D8 и писал курс про блог. Однако вскоре я перешел на более современный drupal/recommended-project и, кстати, курс про блог на drupal обновил под этот проект. Но осталась одна проблема, мои проекты и сайты моих постоянных клиентов остались на 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 8", то в курсе, что 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.

Готово.

Комментарии