Главная

Переход с Drupal 10 на Drupal 11: пошаговый чек-лист и эталонный composer.json

28-09-2025

Обновление ядра всегда связано с рисками: конфликты версий Symfony, несовместимые модули, баги с jQuery. Ниже я собрал уникальный и проверенный план обновления Drupal 10 до Drupal 11, основанный на практическом опыте.

1. Подготовка

  • Сделать резервную копию базы: drush sql-dump > backup.sql
  • Зафиксировать composer.lock в Git.

2. Изменения в composer.json

  • Обновить ядро до версии ^11.2 (core-recommended, core-composer-scaffold, core-project-message).
  • Перевести Drush на диапазон ^12.4 || ^13.3 для совместимости с обоими поколениями.

3. Обновление через Composer

chmod u+w web/sites/default
composer update drush/drush drupal/core-* symfony/* --with-all-dependencies
composer drupal:scaffold

4. После обновления

drush updb -y
drush cr
drush status

В админке на странице /admin/reports/status должна появиться версия Drupal 11.2.x.

5. Чистка конфигурации

Если появляется ошибка с ключом stale_file_threshold, его нужно удалить из активного конфига:

drush cdel system.performance stale_file_threshold
drush cr

6. Популярные баги после апдейта

  • Slick Slider может ломаться из-за того, что в jQuery 3.7 удалили функцию jQuery.type(). Решение — добавить shim в свой кастомный JS:

    if (typeof jQuery.type !== "function") {
      jQuery.type = function (obj) {
        if (obj === null) return "null";
        if (Array.isArray(obj)) return "array";
        return typeof obj;
      };
    }
  • Права на sites/default: перед обновлением — chmod u+w web/sites/default, после — chmod u-w web/sites/default.

7. Эталонный composer.json для Drupal 11

Ниже приведён рабочий пример файла composer.json, который можно использовать как основу для новых проектов.

{
  "name": "drupal/recommended-project",
  "description": "Project template for Drupal 11 projects with relocated web root",
  "type": "project",
  "license": "GPL-2.0-or-later",
  "homepage": "https://www.drupal.org/project/drupal",
  "support": {
    "docs": "https://www.drupal.org/docs/user_guide/en/index.html",
    "chat": "https://www.drupal.org/node/314178"
  },
  "repositories": [
    { "type": "composer", "url": "https://packages.drupal.org/8" },
    { "type": "composer", "url": "https://asset-packagist.org" }
  ],

  "require": {
    // --- Core Drupal ---
    "drupal/core-recommended": "^11.2",
    "drupal/core-composer-scaffold": "^11.2",
    "drupal/core-project-message": "^11.2",

    // --- Drush ---
    // Поддержка двух веток: 12 для Drupal 10, 13 для Drupal 11
    "drush/drush": "^12.4 || ^13.3",

    // --- Администрирование ---
    "drupal/admin_toolbar": "^3.4",
    "drupal/block_class": "^4.0",
    "drupal/lang_dropdown": "^2.1",
    "drupal/weight": "^3.4",

    // --- SEO / Метаданные ---
    "drupal/pathauto": "^1.12",
    "drupal/metatag": "^2.0",
    "drupal/schema_metatag": "^3.0",
    "drupal/redirect": "^1.9",
    "drupal/robotstxt": "^1.5",
    "drupal/simple_sitemap": "^4.1",

    // --- Безопасность / Оптимизация ---
    "drupal/antibot": "^2.0",
    "drupal/minifyhtml": "^2.0",
    "enshrined/svg-sanitize": "^0.18.0",

    // --- Контент / Формы ---
    "drupal/webform": "^6.3@beta",
    "drupal/rabbit_hole": "^1.0",
    "drupal/easy_breadcrumb": "^2.0",

    // --- Мультимедиа / UI ---
    "drupal/blazy": "^3.0",
    "drupal/blazy_photoswipe": "^2.0",
    "drupal/slick": "^3.0",
    "drupal/slick_extras": "^2.0",
    "drupal/slick_views": "^3.0",
    "drupal/superfish": "^1.7",
    "drupal/views_accordion": "^2.0",
    "drupal/jquery_ui_accordion": "^2.1",
    "drupal/photoswipe": "^5.0",
    "bower-asset/slick-carousel": "^1.8",
    "npm-asset/photoswipe-dynamic-caption-plugin": "^1.2",
    "drupal/webp": "^1.0@RC",
    "drupal/youtube": "^3.0@beta",
    "drupal/image_effects": "^4.0",

    // --- Cookie / Трекинг ---
    "drupal/eu_cookie_compliance": "^1.24",
    "drupal/google_tag": "^2.0",

    // --- Бэкапы / Служебные модули ---
    "drupal/backup_migrate": "^5.0",
    "drupal/file_mdm": "^3.1 || ^3.2", // поддержка Drupal 10 и 11

    // --- Системные утилиты ---
    "wikimedia/composer-merge-plugin": "^2.1",
    "oomphinc/composer-installers-extender": "^2.0",
    "composer/installers": "^2.2"
  },

  "conflict": {
    "drupal/drupal": "*"
  },

  "minimum-stability": "stable",
  "prefer-stable": true,

  "config": {
    "sort-packages": true,
    "allow-plugins": {
      "composer/installers": true,
      "drupal/core-composer-scaffold": true,
      "wikimedia/composer-merge-plugin": true,
      "oomphinc/composer-installers-extender": true
    },
    // фиксируем версию PHP, чтобы Composer не тянул пакеты под старые версии
    "platform": {
      "php": "8.3.0"
    }
  },

  "scripts": {
    "post-install-cmd": [
      "rm -f web/robots.txt",
      "rm -f web/INSTALL.txt",
      "rm -f web/README.md",
      "rm -f web/README.txt",
      "rm -f web/example.gitignore"
    ],
    "post-update-cmd": [
      "rm -f web/robots.txt",
      "rm -f web/INSTALL.txt",
      "rm -f web/README.md",
      "rm -f web/README.txt",
      "rm -f web/example.gitignore",
      "rm -f web/robots.txt"
    ]
  },

  "extra": {
    "drupal-scaffold": {
      "locations": { "web-root": "web/" }
    },
    "merge-plugin": {
      "include": [
        "web/modules/contrib/webform/composer.libraries.json"
      ]
    },
    "installer-types": [
      "bower-asset",
      "npm-asset"
    ],
    "installer-paths": {
      "web/core": ["type:drupal-core"],
      "web/libraries/ckeditor/plugins/{$name}": ["vendor:ckeditor-plugin"],
      "web/libraries/{$name}": [
        "type:drupal-library",
        "type:bower-asset",
        "type:npm-asset"
      ],
      "web/modules/contrib/{$name}": ["type:drupal-module"],
      "web/profiles/contrib/{$name}": ["type:drupal-profile"],
      "web/themes/contrib/{$name}": ["type:drupal-theme"],
      "drush/Commands/contrib/{$name}": ["type:drupal-drush"],
      "web/modules/custom/{$name}": ["type:drupal-custom-module"],
      "web/themes/custom/{$name}": ["type:drupal-custom-theme"]
    }
  }
}

Заключение

Следуя этому плану и используя предложенный composer.json, можно обновить сайт на Drupal 10 до Drupal 11 без серьёзных проблем. Чек-лист покрывает основные сложности: миграцию Symfony, замену Drush, чистку конфигураций и баги с библиотеками. Этот материал можно использовать как универсальную инструкцию для будущих апгрейдов.

Похожие статьи