Drupalのモジュールをできるだけ労力を使わずにDrupal10に対応させる方法

# はじめに

2023年11月にDrupal9のEOLを控え、Drupal10へのアップグレード対応を行わないといけない方も多いのではないでしょうか。
そんな方向けにDrupalサイトで利用しているカスタムモジュールや公式未対応のコントリビュートモジュールについて、できるだけ少ない労力でDrupal10に対応する手順を考えてみました。
お役に立てれば幸いです。


# 前提条件

- Drupalをcomposer (drupal/recommended-project) を使ってインストールしている。
    - composer でモジュールをインストールする際に、環境によっては依存関係のエラーが発生する場合があります。これらの依存関係エラーを修正するスキルがあることも前提とします。
- Drupal9の開発環境を用意できる。
    - ここで示す方法は本番環境に直接実施しないでください。
- Drushを利用できる。※DrushはDrupal用のコマンドラインツールです。以下ではDrush10を利用して実施しています。

※上記の前提条件から外れる場合、当記事に記載の通りのコマンドでは実施できない可能性がありますので、予めご了承ください。

# Drupal10に対応させるモジュール

ここでは例として `Scheduled Updates`モジュールをDrupal10に対応させてみようと思います。
このモジュールはDrupal8までの対応となっており、Drupal9及び10には対応していません。

なお、この記事の内容は自作のカスタムモジュールの対応にも利用可能です。

# コントリビュートモジュールの場合、公式サイトのissueでパッチが配布されていないか確認する。

まずはパッチが無いか確認するのが良いでしょう。
`Scheduled Updates`モジュールの場合、
公式サイトのissueにDrupal9に対応するパッチがアップロードされています。
https://www.drupal.org/project/scheduled_updates/issues/3172330

こちらを適用することでDrupal9には対応できます。
※公開されているパッチは完全でない場合があります。またバグが残っている可能性もあるため、テストはしっかりと行う必要があります。

ただDrupal10 対応については、この記事の執筆時点(2023年7月5日)では完全なパッチの提供は無いようです。

# Drupal9 に Upgrade Status モジュールをインストールする。

Drupal9に`Upgrade Status`モジュールをインストールして分析を実行することで、修正内容をリストアップしてくれます。

```shell
# Drupalが配置されているディレクトリに移動
#（ここでは/var/www/htmlに配置しているものとします。）
cd /var/www/html

# モジュール公式ページの記載に従ってインストール
# 以下の[copy version above] 部分は、
# 最初のコマンドで取得したバージョン文字列に置き換えてください。
composer show drupal/core | grep versions
composer require --dev drupal/core-dev:[copy version above] --update-with-all-dependencies
composer require drupal/upgrade_status

# upgrade_status 分析実行
drush upgrade_status:analyze scheduled_updates

# Drupal内のすべての対応状況を分析する場合はallオプションを指定します。
drush upgrade_status:analyze --all

# コマンドで分析を実行した場合、
# 管理画面( /admin/reports/upgrade-status )で分析結果を表示するとエラーが出るため、
# ファイルパーミッションを変更 
sudo chmod -R 777 /tmp/upgrade_status/
```

# ソースコードの自動修正を行う。

drupal-rector を使ってリストアップされた内容のいくつかは自動で修正できます。

```shell
# drupal-rector のインストール
composer require palantirnet/drupal-rector --dev
# rector.php をdrupalディレクトリにコピーする
cp vendor/palantirnet/drupal-rector/rector.php .

# 自動修正を実行
# (まずはdry-runオプションを付けて実施し修正内容を事前に確認することをお勧めします)
vendor/bin/rector process web/modules/contrib/scheduled_updates --dry-run
vendor/bin/rector process web/modules/contrib/scheduled_updates

# 再度対応状況の分析を行う
drush upgrade_status:analyze scheduled_updates

```

# ソースコードの手動修正を行う。

残念ながら分析結果で示される課題全てを自動修正することはできないため、残りの課題は手動で修正を行います。
修正方法についても詳しく記載されているため、それほど難しいとは感じないと思います。


対応後は再度`upgrade_status`で分析を行います。
```shell
drush upgrade_status:analyze scheduled_updates
```

一覧のLOCAL SCAN RESULT 列に `No problems found` と表示されればOKです！

# 動作確認

最後に実際にDrupal10にインストールして利用できるかテストを行います。
残念ながら`Upgrade Status`モジュールによる分析は完璧ではないため、動作確認時に問題が発生することも多々あります。
必ずテストを行ってください。

`Scheduled Updates`モジュールも実際に動かしてみると、問題が残っていました。
継承しているクラスのメソッドに戻り値の型指定が追加されているため、そのままではエラーとなっていました。
戻り値の型にarrayを指定してやります。

```php:schedules_updates/src/Routing/RouteSubscriber.php
/**
 * {@inheritdoc}
 */
public static function getSubscribedEvents(): array
{
  $events = parent::getSubscribedEvents();
  $events[RoutingEvents::ALTER] = array('onAlterRoutes', -110);
  return $events;
}
```

以上で意図通りに動作するようになりました！

# 参考記事

- Upgrade Status | Drupal.org
https://www.drupal.org/project/upgrade_status

- GitHub Drupal Rector #readme
https://github.com/palantirnet/drupal-rector#readme

- Scheduled Updates > Issues > Drupal 9 compatibility fixes | Drupal.org
https://www.drupal.org/project/scheduled_updates/issues/3172330

- Scheduled Updates > Issues > Drupal 10 compatibility
https://www.drupal.org/project/scheduled_updates/issues/3363800