Pharアーカイブの中のソースコードを修正する
 2023/07/06
 2023/07/15

とある事情で古いPHPUnitをpharファイル経由で使っているのですが、バグがあってそれを直す方法もわかってるんだけど、pharアーカイブの中のソースコードを修正する方法がわからず試行錯誤したので、メモしておきます。
Pharとは
phar 拡張モジュールは、PHP アプリケーション全体をひとつの “phar” (PHP Archive) ファイルにまとめてしまい、配布やインストールを容易にするためのものです。 https://www.php.net/manual/ja/book.phar.php
pharコマンドで、展開したり纏めたりすることはできるのですが、実行可能なpharアーカイブファイルの情報は展開した情報には含まれないため、extractで展開して packで纏めた場合、実行可能ではないpharアーカイブファイルになってしまうようです。
pharアーカイブファイルに付与されている情報
実行可能なpharファイルの実行スクリプトの情報は、stubという形でpharファイルに埋め込まれているようです。stubに加えて metaという埋め込み情報もあるようです。
Pharアーカイブファイル内のソースコードを変更する手順
- 適当な場所に元のpharアーカイブファイルを配置する。
- stub情報を保存する。
- phar extract コマンドでソースコードを展開する。
- 目的の修正を行なう。
- phar pack コマンドで固める。
- stub情報を付与する。
$  cp original.phar /somewhere/
$ cd /somewhere
$ touch stub.php
$ phar stub-get -f original.phar -s stub.php
$ mkdir src
$ cd src
$ phar extract -f ../original.phar
# ここで目的の修正を行ないます。
$ phar pack -f ../new.phar
$ cd ..
$ phar stub-set -f new.phar -s stub.php上記の手順で作成した new.phar は、目的のソースコード修正が施された実行可能なpharアーカイブファイルとなります。