Drupal-CMSのプレリリース版をMacBookにインストールし触れた後、しばらく放置していたのでDrupalコアと各モジュールのアップデートを行いました。Drupal-CMSはコアプログラムとモジュールを管理画面上からアップデート可能なので、管理画面上からアップデートを行います。Drupalコアのアップデートは問題なく完了し、モジュールのアップデートを行います。
モジュールも複数アップデートする必要があります。管理画面上からアップデートするモジュールにチェックを入れる事で複数のモジュールを一度にアップデートする事が可能ですが、念の為、一つづつ慎重にアップデートします。
管理画面上からのアップデートが心配でしたが、問題なく進んでいきます。順調に進んでいくかと思っていたらAutomatic Updateモジュールをアップデートするとエラーが出てしまいます。
エラーが出た環境
- Macbook M1 Pro Max
- OrbstackとDDEVによるLAMP環境
- Drupal-CMS 1.0
Drupal-CMSプレリリース版からDrupal-CMS 1.0にアップデート
Automatic Updateモジュールを管理画面からアップデートした際にエラーが発生
発生したエラーの内容は以下になります。
エラー内容
The website encountered an unexpected error. Try again later.
LogicException: Stored hash key deleted. in Drupal\package_manager\Validator\LockFileValidator->validate() (line 122 of modules/contrib/automatic_updates/package_manager/src/Validator/LockFileValidator.php).
Symfony\Component\EventDispatcher\EventDispatcher::Symfony\Component\EventDispatcher\{closure}() (Line: 206)
Symfony\Component\EventDispatcher\EventDispatcher->callListeners() (Line: 56)
Symfony\Component\EventDispatcher\EventDispatcher->dispatch() (Line: 50)
Drupal\automatic_updates\Validation\StatusChecker->runStatusCheck() (Line: 62)
Drupal\automatic_updates\Validation\StatusChecker->run() (Line: 85)
Drupal\automatic_updates\Validation\StatusCheckRequirements->getRequirements() (Line: 30)
automatic_updates_requirements()
call_user_func_array() (Line: 355)
Drupal\Core\Extension\ModuleHandler->Drupal\Core\Extension\{closure}() (Line: 307)
Drupal\Core\Extension\ModuleHandler->invokeAllWith() (Line: 354)
Drupal\Core\Extension\ModuleHandler->invokeAll() (Line: 109)
Drupal\system\SystemManager->listRequirements() (Line: 53)
Drupal\system\Controller\SystemInfoController->status()
call_user_func_array() (Line: 123)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 593)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 121)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext() (Line: 97)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 183)
Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 116)
Drupal\page_cache\StackMiddleware\PageCache->pass() (Line: 90)
Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 709)
Drupal\Core\DrupalKernel->handle() (Line: 19)
Automatic Updates モジュール(automatic_updates) が composer.lock のハッシュキーを検証しようとした際に、該当するハッシュキーが削除または変更されたために発生。
考えられる原因
- composer.lock の不整合
- Automatic Updates モジュールの不具合
上記の不具合がエラーを出してしまっているのではないかと考えます。
エラーの修正を行います。composer.lockファイルの不整合は過去にも遭遇しているのでまず確認します。
composer.lockの確認
% ddev ssh
// ddevにsshで接続します。
// ZchからBashに変わります。
shinichirotakeda@drupal-cms-web:/var/www/html$
// shinichirotakeda@drupal-cms-web:/var/www/htmlは以降省略します。
// composer.lockファイルの確認
$ composer validate
// エラーの確認 エラーは出ていません。
$ composer update --lock
// 念の為Lockファイルを再生成してみます。
$ drush cr
// キャッシュをクリア
確認しますがエラーは消えません。composer.lockを一旦削除してcomposer installで依存関係を再インストールします。
$ rm composer.lock
// composer.lockの削除
$ composer install
// 依存関係を再インストール
$ drush cr
// キャッシュのクリア
$ drush updatedb
// DBのアップデート
確認しますがエラーが消えません。automatic_updatesのモジュールを疑います。
composer.lockの不具合ではなさそうなので、automatic_updatesのモジュールの不具合を疑います。モジュールをアンインストールし再インストールしてみます。
automatic_updatesの再インストール
$ drush pm:uninstall automatic_updates
// automatic_updatesのモジュールをアンインストールします。
The following extensions will be uninstalled: automatic_updates, automatic_updates_extensions
┌ Do you want to continue? ───────────────────────────────────┐
│ Yes │
└──────────────────────────────────────────────────────────────┘
[success] Successfully uninstalled: automatic_updates, automatic_updates_extensions
$ drush en automatic_updates -y
// automatic_updatesのモジュールを再インストールします。
[notice] automatic_updates 用の ja の翻訳を確認しました。
[notice] automatic_updates 用の ja の翻訳をダウンロードしました。
[notice] automatic_updates 用の ja の翻訳をインポートしました。
[warning] foreach() argument must be of type array|object, null given Mapping.php:31
[warning] foreach() argument must be of type array|object, null given Mapping.php:230
[notice] Updated default configuration to ja
[warning] foreach() argument must be of type array|object, null given Mapping.php:31
[warning] foreach() argument must be of type array|object, null given Mapping.php:230
[notice] Translations imported: 0 added, 28 updated, 0 removed.
[notice] The configuration was successfully updated. 200 configuration objects updated.
[notice] Message: 1 個の翻訳ファイルをインポートしました。/0/個の翻訳を追加し、/28/ 個の翻訳を更新、/0/個の翻訳を削除しました。
[notice] Message: 構成を更新できました。/200/個の構成オブジェクトが更新されました。
[success] Module automatic_updates has been installed. (Configure)
$
// 再インストールが完了
automatic_updatesのモジュールをアンインストールし、再インストールしたらエラーが消えました。
[warning] foreach() argument must be of type array|object, null givenの警告が出ていますが、管理画面を確認するとエラーは消えており問題なくアップデートされています。
今回のエラーはautomatic_updatesのモジュールに不具合があり、composer.lockのハッシュキーの検証が出来ない事で発生したエラーのようです。composer.lockを再インストールし、automatic_updatesのモジュールの再インストールを行なう事でエラーが解消されました。





automatic_updatesモジュールのインストール時の管理画面のログを確認するとpackage_managerに関する警告が出ています。
エラーではないのでDrupal-CMSの利用に直接の影響は出ていないのですが気になるので調べてみます。
表示された警告
automatic_updatesモジュールのインストール時ターミナルに出た警告
[warning] foreach() argument must be of type array|object, null given Mapping.php:31
[warning] foreach() argument must be of type array|object, null given Mapping.php:230
管理画面のログに出たpackage_managerの警告
The following paths in /var/www/html aren't recognized as part of your Drupal site, so to be safe, Package Manager is excluding them from all stage operations. If these files are not needed for Composer to work properly in your site, no action is needed. Otherwise, you can disable this behavior by setting the package_manager.settings:include_unknown_files_in_project_root config setting to TRUE. .ddev README.md launch-drupal-cms.sh recipes
Packageマネージャーの警告は「Package Manager が認識しないファイルを無視する」となっています。この事からautomatic_updates モジュールでnull になっている配列が Package Manager から提供されるデータの可能性が高いです。
automatic_updates は package_manager を通じてパッケージの更新情報を取得します。package_manager の動作がブロックされることで、automatic_updates が必要なデータを取得できずに null を返しているのではないかと考えられます。
この警告が具体的にどう影響しているのか探してみます。
警告の影響
アップデートの必要がある際、管理画面に表示される以下のメッセージ
//
利用中の1つ以上のモジュールやテーマの最新版が入手可能です。 サイトを適切に機能させ続けるために、できるだけ早く更新するべきです。
//
コアプログラムやモジュールが最新でアップデートの必要がない場合でも上記のメッセージが管理画面上に常時表示されてしまいます。
automatic_updates モジュールは、package_manager モジュールとの依存関係があるので依存関係に不具合があるのではないかと考えられます。モジュールの破損も考えられますので、モジュールの削除や依存関係の再チェックを行なう必要があります。
記事が長くなってしまうので、以降行った解決策は次の記事にまとめます。
プレリリースが公開された時にインストールしたDrupal-CMSですがしばらく触れていなかったので久しぶりに管理画面にログインしたらコアプログラムとモジュールのアップデートが溜まっていたので、アップデートを行いました。
Drupal-CMSからDrupalコアを含めモジュールやテーマを管理画面上でアップデート可能になったので、管理画面上からアップデートを行いますが、automatic_updatesモジュールのアップデートでエラーが出てしまったので今回修復を行いました。エラーの解消はできましたが、automatic_updates モジュールとpackage_manager モジュールの不具合が警告として出ています。
他にも警告が出ていますので今回出ている警告の原因の修復も合わせて次回の記事でまとめます。
管理画面からのインストールが便利になったので、コアプログラムもモジュールやテーマも管理画面から行ってみましたが、モジュールによってはComposerを使用しないと依存関係に不具合が出てしまうかもしれません。
今回のケースは、プレリリースからのアップデートという環境で出た不具合なので、正式リリース版のインストールからのアップデートでは今回発生したエラーは再現しないかもしれません。