Composerのself-updateに失敗したときの取り組み

先に結論を。
aptでインストールしていたComposerをアインインストールして、Composerのインストーラから再度入れ直ししたよ。

再び(みたたび?)PHPをインストールする

WSLにPHPとcomposerをインストールしていた時のことです。
またまたPHPの案件にアサインされる予定があり、今度こそ私も実装することになりそうでして、改めて基礎を学ぼうとしています。
(これまでのPHP案件は、チームリーディングの立場でのアサインとなり、結局実装する機会がありませんでした…。)

WSLにインストールしているPHPのバージョンを確認すると、7.2系。
さすがに今から勉強するのに7系は古いと思い、PHP8.2にバージョンアップしました。
なぜ8.2なのかというと、手元にある参考書が8.2系の本だったためですね。

PHP8.2の導入自体はいろんな方がサイトで公開してくださっていて、
そのありがたい先人の知恵の内容に従うことで順調にインストールは完了。

WSLに入れたComposerが古い?

さて、PHPを使うとなるとほぼセットで導入することになるのがcomposer。
WSLのUbuntuには入っていなかったので、aptコマンドを使ってインストールを実施。

sudo apt install composer

実行したコマンドによるインストールが完了したので、composerコマンドが使えるかの確認も兼ねて、バージョン確認を実施。

composer --version
Composer 2.2.6 2022-02-04 17:00:38

2022?やたら古いような?

Composerのアップデートでエラーが続く

Composerの公式サイトで最新バージョンを確認すると、この記事を作成している時点で2.8.12。
2.2.6からだいぶ更新が入っていますので、アップデートすることにします。

composer self-update

コマンドを実行するとこで、アップデートできるとの情報があったので早速実行。

composer self-update
PHP Fatal error: Uncaught Error: Call to undefined function Symfony\Component\Console\mb_detect_encoding() in /usr/share/php/Symfony/Component/Console/Application.php:1212
Stack trace:省略

結果、手順を紹介しているサイトでは見たことのないエラーが出力されました。
調べてみると、どうやら追加モジュールであるmbstringが不足している模様。
こちらもaptコマンドにてinstallを実施。

改めてself-updateを実行すると…。

PHP Fatal error: Uncaught Error: Class "Normalizer" not found in /usr/share/php/Symfony/Component/String/AbstractUnicodeString.php:31
Stack trace:省略

エラーが変わりました。
どうやらまだモジュールが不足しているようです。

sudo apt install php8.2-intl

にてモジュールを追加し、もう一度self-updateを実行します。

Deprecation Notice: Using ${var} in strings is deprecated, use {$var} instead in /usr/share/php/Symfony/Component/Console/Command/DumpCompletionCommand.php:48
Deprecation Notice: Using ${var} in strings is deprecated, use {$var} instead in /usr/share/php/Symfony/Component/Console/Command/DumpCompletionCommand.php:56

Command "self-update" is not defined.

ここまでやって、定義されてないと?!

Composerを入れなおして解決

今回対処した方法は、冒頭でお伝えした通りのやり方でした。
結局aptでインストールしたcomposerは削除。(設定残ってたら嫌なのでpurgeで。)

apt purge composer

Composerのインストーラをダウンロードしてきて実行する方法に切り替え

curl -sS https://getcomposer.org/installer | php

上記の流れで、aptではなく用意されているインストーラを実行してインストールする方法で、最新のComposerを入れることができました。

Composer入れるだけで疲れた…。