Czy zdarzyło się wam grzebać lub poprawiać coś w instalowanych paczkach na swoim projekcie ? Jeżeli tak to dobrze wiecie, że jakiekolwiek zmiany zapisane bezpośrednio w folderze node_modules nie maja prawa bytu ze względu na to, że zostaną nadpisane przy jakiekolwiek zmianie / instalacji projektu. Na szczęście przychodzi nam na ratunek moduł patch-package.
Normalnie gdy odkryjemy jakiś błąd lub chcielibyśmy dodać jakikolwiek feature do jednych z bibliotek, które znajdują się u nas w folderze node_modules, musimy z "forkować" oryginalną bibliotekę, nanieść zmiany i dać pr merge na githubie. Ale jeżeli poprawiamy jakiś błąd na dużym projekcie, takie rozwiązanie może trwać pare dni, jeżeli nie tygodni. Testy, review team itd. Co jak nie chcemy się w to bawić, albo porostu nie mamy na to czasu ?
patch-package
Dla przykładu chcemy edytować paczkę przykład-lib
- Instalacja patch-package
yarn add --dev patch-package postinstall-prepare
instalacja postinstall-prepare musi zostać dołączona ze względu na to aby upewnić się, że patch-package zostanie uruchomiony nawet po komendzie yarn remove
2. Zmiana plików w przykład-lib
Edytujemy i zapisujemy zmiany normalnie tak jakby by były częścią projektu.
3. Uruchomienie patch-package
yarn patch-package przykład-lib
Patch-package wychwyci zmiany w przykład-lib, da znać na terminalu, że zmiany zostały zapisane, dodatkowo dołoży nam folder do projektu "/patches", gdzie przechowuje nasze zmiany.
4. Edycja pliku package.json
Ostatnim krokiem instalacji patch-package jest dodanie skryptu "prepare" do naszego pliku package.json. Dzięki temu poleceniu nasz projekt zawsze będzie niezależnie i automatycznie dodawał nasze zmiany przy poleceniach yarn czy npm install.
"scripts": {
"prepare": "patch-package"
}
To już wszystko co trzeba zrobić aby móc dowolnie patchować 3rd party libraries. Dla mnie ta opcja jest bardzo pomocna, jednakże nie wolno zapominać, że najlepszym rozwiązaniem jest ciągle "forkowanie" bibliotek i nanoszenie zmian dla nas wszystkich. Open source górą.
Jak zwykle pozdrawiam serdecznie.