Починаючи з 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.
Готово.