このすみ技術ろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

composer self-updateでシンタックスエラーが発生するときの対処法

とある環境で composer self-update [とあるバージョン] を実行したら、シンタックスエラーやらSymfonyのCall to undefined functionやらが発生して、アップデートできないトラブルに見舞われました。

最終的には力技で解決したのですが、ハマったのでメモします。

Call to undefined function Symfony\Component\Console\Output\stream_isatty()

まず引っかかったのが、SymfonyのCall to undefined functionエラーです。

Uncaught Error: Call to undefined function Symfony\Component\Console\Output\stream_isatty() ...

エラーメッセージで検索したところ、解決策はGitHub issueに書いてありました。

Update to php 7.2 or run cachetool with NO_COLOR attribute:
NO_COLOR=true cachetool
https://github.com/gordalina/cachetool/issues/153

NO_COLOR=true を付与して、composer self-updateすれば良いということになります。

NO_COLOR=true composer self-update

なぜSymfonyの関数エラーが発生したのか

これはずばり、GitHub issueに書いてある通りです。

Update to php 7.2...

私が触っている現在のPHP環境が、7.2より古かったため発生するエラーでした。

self-updateのシンタックスエラーについて

エラー内容の詳細は省きますが、これも調べた限り、手元のPHPバージョンが古いことで発生しているエラーだと分かりました。

そして、先ほどのSymfonyと違い、解決策もなさそうです。 最終的には方針を転換して、self-updateをcomposer再インストールに置き換えることで、対処しました。

# これは失敗した
$ composer self-update 1.10.6

# アップデートしたいバージョンのcomposerを明示的に持ってきて、再インストールする
wget https://getcomposer.org/download/1.10.6/composer.phar
sudo mv composer.phar /usr/local/bin/composer

Most likely, you want to put the composer.phar into a directory on your PATH, so you can simply call composer from any directory (Global install), using for example:
sudo mv composer.phar /usr/local/bin/composer
https://getcomposer.org/download/

まとめ

composer self-updateのエラーは直せなかったですが、最終的にはアップデートしたいバージョンでcomposerを再インストールし、力技で解決しました。

本件のまとめですが、どちらのエラーもPHPが新しければ、そもそも遭遇しなかったはずのエラーです。 PHPをバージョンさせていくことの、重要性を痛感した一件でした。