0. まず最初に

弊社のホームページおよび Ore no Drupal では、現在 Drupal 11 へのアップデートを完了しております。この記事では、私・吉川が実際にアップデート作業の中で直面したエラーやトラブルについてご紹介します。同じようにアップデートを検討している方の参考になれば幸いです。

1. 依存関係の衝突で Composer update が進まない

Drupal 11 にアップデートしようと思い、まず試したのが以下のコマンドでした。

composer require drupal/core-recommended:^11 drupal/core-composer-scaffold:^11 drupa
l/core-project-message:^11 --update-with-all-dependencies

一見、これであっさりDrupal 11に切り替わりそうに見えるのですが、現実はそんなに甘くありませんでした。
実行すると、sebastian/diffsymfony/console など、いろいろなライブラリでバージョンの衝突が発生。次々とエラーが表示され、まったく進まない状態に。

よくよく確認してみると、たとえば phpunit/phpunitdrupal/core-devsebastian/diff の古いバージョン(^4)を使っている一方で、Drupal 11 のほうは ~6.0.2 を求めている…というような、いわゆる「バージョンの板挟み」に陥っていたのです。

これでは先に進めないので、思い切って drupal/core-dev を一旦削除。いったん最低限の構成にして Drupal コアだけを先にアップデートし、必要なモジュールは後から戻す、という作戦に切り替えました。

正直、少し強引な方法ではありますが、この「最小構成にしてアップデート → あとで整える」という流れが一番現実的でした。Composer のエラーに悩まされている方は、まずこの方法を試してみるのがおすすめです。

2. symfony/console のバージョン競合

次に引っかかったのが symfony/console のバージョン問題です。Drupal 11 は Symfony 7(特に ~v7.3.0)を要求します。

ところが、Drush が依存している chi-teck/drupal-code-generator というライブラリが symfony/console の 6系(^6.3)にしか対応していない状況でした。

つまり、Drupal は 7 を使いたい、Drush は 6 を使いたい。これもまた、バージョンのぶつかり合い。結果、Composer は「どっちも同時には満たせません」と言ってきてしまい、アップデートが止まってしまいました。

ここでもやっぱり、「一旦削除作戦」が有効でした。Drush を外してコアだけアップデートし、そのあと最新版(13系など)をインストールし直すことで、解決することができました。

ddev composer why symfony/console で依存元を調べながら、いらないものは潔く外す。これが大事です。

3. 非推奨モジュール・削除済みモジュールの存在

Drupal 11 では、これまで当たり前のように使っていたモジュールのいくつかが、コアから外されていたり、そもそもサポート対象外になっていたりします。

たとえば Tour モジュールや QuickEdit モジュールなど。Drupal 10までは問題なく動いていたのに、Drupal11では「このモジュールは存在しません」「対応していません」とエラーが出てしまい、足止めされてしまいます。

実際、私も QuickEdit を入れたままアップデートを試みたところ、Composer が「このモジュール見つかりません」と言って止まりました。

解決方法はシンプルで、事前に次のように削除しておくことです。

composer remove drupal/quickedit

ただし、重宝しているモジュールの場合もあり、この時は別のモジュールで代用できるのか調査を行う必要があります。
互換性が確認されていない contrib モジュールは、アップデート前にリストアップして精査しておくと、後々の作業がスムーズになります。

4. PHPバージョンの壁

Drupal 11 からは、PHP 8.3 以上が必須になりました。Drupal 10 のときは PHP 8.1 でも問題なかったのですが、今回からはそうはいきません。

アップデート直後、以下のようなエラーが出て処理が止まりました。

Your Composer dependencies require a PHP version ">= 8.3.0". You are running 8.1.33.

ローカル環境であれば brew install php@8.3 などで切り替えは容易ですが、サーバー環境では少し工夫が必要です。バージョンを切り替える際に alias を使って失敗したこともあり、unalias php で元に戻しました。

本番環境では、あらかじめ PHP バージョンの対応可否を確認しておくことをおすすめします。

5. MySQLが対応していない時・・・

Drupal 11 では、MySQL 8.0.17 以上(または MariaDB 10.5.8 以上)が必要です。

しかし実際の現場では、「本番環境がMySQL 5.7で固定されており、すぐにアップグレードできない」「ホスティングサービス側の制約でバージョンアップが困難」といったケースも少なくありません。
私たちのプロジェクトでも、まさにこの課題に直面しました。

このような状況でもDrupal 11の導入・検証を諦める必要はありません。互換性レイヤーとして機能する「Driverモジュール」を使用することで、MySQL 5.7環境でも動作させることが可能です。
実際にこのOre no DrupalサイトもMySQL5.7の環境ですが、この「Driverモジュール」を使用することでDrupal11へのアップデートを実現しております。

6. Twig テンプレートの書き方エラー

コアのアップデートが完了した後、見た目が一部おかしくなってしまったページがありました。よく見ると、テンプレートが表示されていない。Twigテンプレートのエラーでした。

エラーログを見てみると、旧来の Twig では動いていた構文が、新しいバージョンでは非推奨になっているとのこと。

たとえば、以下のような書き方は NG になります。

{% for i in 1..depth-1 if depth > 1 %}

Twig 3 ではこういった「for 文の中に if 条件を混ぜる」書き方が推奨されておらず、代わりに以下のように書き換える必要があります。

{% if depth > 1 %}
  {% for i in 1..(depth-1) %}
    <div class="section-{{ i }}">
  {% endfor %}
{% endif %}

こうした細かい変更が、テンプレートの読み込みエラーや画面崩れの原因になることもあるので、Twig もアップデート後に必ずチェックするようにしましょう。

おわりに

Drupal 11 へのアップデート作業は、Composer まわりの依存関係の調整に一番時間がかかりました。

でも、一つ一つのトラブルに向き合って乗り越えていくうちに、「こうすればうまくいく」という流れが見えてきました。

最後に、今回のアップデートで学んだポイントをまとめておきます。

  • アップデート前に、互換性のないモジュールはチェックして削除しておく
  • PHP のバージョンや Composer の環境を事前に整えておく
  • Twig などテンプレートまわりも見落とさない

Drupal 11 の機能自体は素晴らしく、特にパフォーマンス面の改善やコアの整理は開発者にとってうれしいポイントです。

この記事が、これから Drupal 11 へアップデートしようとしている方のヒントになればうれしいです。もしも、Drupal11へのアップデートを考えているが手がつけれない・・・リソースがない・・・といったことがあれば、ぜひ弊社までお問い合わせください!対応させていただきます!