更新履歴
- : デジタルサーカス株式会社の社内記事として公開
- : 公開
この記事は、2025-04-10 に デジタルサーカス株式会社 の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
はじめに
Composer は PHP におけるデファクトスタンダードなパッケージ管理システムである。
Composer を拡張するプラグインの一つに、composer-patches という Composer パッケージがある。 これは、Composer でパッケージをインストールするときにそのパッケージへ任意のパッチを当てるプラグインである。
社内で発見しすぐに適用しなければならないバグ修正や、Pull Request こそあるもののなかなかマージされない機能等をすぐさま適用してリリースすることができる。
弊社でも多くのプロジェクトで活用されており、のべ数では数百ものパッチが当てられている。
macOS での問題点
composer-patches
は、macOS で一部のパッチの適用に失敗することが知られている。 関連 issues:
- https://github.com/cweagans/composer-patches/issues/522
- https://github.com/cweagans/composer-patches/issues/326
これは、composer-patches
の想定する patch
コマンドが GNU 実装の patch であることに由来する。 macOS にプリインストールされている patch
はいわゆる BSD patch であり、GNU patch とは完全な互換性がない。
ワークアラウンドとして、macOS にも GNU patch をインストールしてしまうという方法がある。 例:
$ brew install gpatch
$ echo 'PATH="/opt/homebrew/opt/gpatch/libexec/gnubin:$PATH"' >> ~/.zshrc
GNU patch を Homebrew などの手段でインストールし、BSD patch よりも優先されるパスに配置すれば問題が解消する。
v2 では
現在ベータ版である composer-patches
v2 では、このワークアラウンドが不要になる (見込み)。
最新の実装では、git apply
コマンドが最優先で使われる。 また、Git リポジトリがない場合 (config.preferred-install
を dist
に設定している場合など。デフォルトではそうなる) には git init
を使って一時的にリポジトリを作成し、その上で git apply
を実行するようになった。
この変更により、環境ごとに差異のある patch
コマンドへの依存がなくなるので、macOS で composer-patches
を使うときの厄介事は解消されるものと思われる。
2.0.0-beta1 のリリースノートより:
この変更で patch
コマンドへの依存が排除された。