Composer jest popularnym narzędziem do zarządzania zależnościami w projektach PHP. Pozwala na instalowanie i aktualizowanie pakietów z różnych źródeł, takich jak Packagist, GitHub lub własne repozytoria. Jednak czasami może być potrzeba zmodyfikowania kodu pakietu, aby naprawić błąd, dodać funkcję lub dostosować go do własnych potrzeb. Jak to zrobić bez naruszania funkcjonalności Composer lub utraty zmian przy aktualizacji pakietu?
Jedną z opcji jest utworzenie forka repozytorium pakietu, wprowadzenie tam zmian i następnie użycie forka jako źródła pakietu w pliku composer.json. W ten sposób można śledzić zmiany i łączyć je z aktualizacjami z góry. Jednak to podejście ma kilka wad:
- Trzeba utrzymywać własny fork pakietu, co może być czasochłonne i nużące.
- Trzeba aktualizować plik composer.json za każdym razem, gdy zmienia się źródło pakietu, co może być podatne na błędy i niewygodne.
- Może się nie chcieć dzielić zmianami publicznie lub zajmować się pull requestami i problemami na GitHubie.
Inną opcją jest użycie funkcji patch Composer, która pozwala na stosowanie własnych patchy do dowolnego pakietu po jego zainstalowaniu lub zaktualizowaniu. Patch jest plikiem, który zawiera różnice między dwiema wersjami pliku lub zestawu plików. Można tworzyć patchy za pomocą narzędzi takich jak Git lub diff. Z funkcją patch Composer, można określić listę patchy dla każdego pakietu w pliku composer.json, a Composer automatycznie je zastosuje po pobraniu pakietu. W ten sposób można zachować zmiany w własnym projekcie i uniknąć modyfikowania bezpośrednio katalogu vendor. To podejście ma kilka zalet:
- Nie trzeba utrzymywać forka pakietu ani zmieniać jego źródła w pliku composer.json.
- Można łatwo cofnąć lub zaktualizować patchy bez wpływu na oryginalny kod pakietu.
- Można zachować patchy prywatnie lub dzielić się nimi wybiórczo z innymi.
Aby używać funkcji patch Composer, trzeba zainstalować plugin cweagans/composer-patches, który dodaje obsługę patchowania pakietów do Composer. Aby go zainstalować, należy uruchomić:
composer require cweagans/composer-patches
Następnie, w pliku composer.json, należy dodać sekcję o nazwie “patches” pod “extra”, gdzie można wymienić patchy dla każdego pakietu. Na przykład:
{
"extra": {
"patches": {
"vendor/package": {
"Opis patcha": "ścieżka/do/pliku/patcha.patch"
}
}
}
}
Można również używać adresów URL lub ścieżek lokalnych jako źródła plików patchy. Na przykład:
{
"extra": {
"patches": {
"vendor/package": {
"Opis patcha": "https://example.com/patch/file.patch"
}
}
}
}
lub
{
"extra": {
"patches": {
"vendor/package": {
"Opis patcha": "../patches/file.patch"
}
}
}
}
Można również używać wildcardów, aby zastosować patchy do wielu pakietów, które pasują do wzorca. Na przykład:
{
"extra": {
"patches": {
"vendor/*": {
"Opis patcha": "ścieżka/do/pliku/patcha.patch"
}
}
}
}
To zastosuje ten sam patch do wszystkich pakietów pod przestrzenią nazw vendor.
Aby zastosować patchy, należy uruchomić:
composer install
lub
composer update
Composer pobierze pakiety i następnie zastosuje patchy zgodnie z plikiem composer.json. Zobaczysz wiadomość taką jak ta:
- Stosowanie patchy dla vendor/package
ścieżka/do/pliku/patcha.patch (Opis patcha)
Jeśli wystąpią jakieś błędy lub konflikty podczas stosowania patchy, Composer powiadomi cię o tym i zapyta, jak postąpić. Możesz wybrać opcję pominięcia patcha, ponownego jego zastosowania lub przerwania całego procesu.
Aby cofnąć patchy, należy uruchomić:
composer install --no-patches
lub
composer update --no-patches
Composer ponownie zainstaluje lub zaktualizuje pakiety bez stosowania żadnych patchy.
Aby dowiedzieć się więcej o funkcji patch Composer, zapoznaj się z dokumentacją pluginu cweagans/composer-patches: https://github.com/cweagans/composer-patches
Mam nadzieję, że ten artykuł był pomocny i pouczający. Jeśli masz jakieś pytania lub uwagi, zostaw komentarz poniżej.