Когда у вас есть ошибка в сторонней зависимости, обычно у вас есть ограниченный набор возможностей для ее исправления.
Вы можете напрямую изменить локальный код зависимости и сделать новую сборку. Это работает, если это критическая ошибка и ее нужно исправить как можно скорее. Но это не лучший вариант, потому что вы потеряете исправление при следующей установке yarn
или npm
. Кроме того, вы не сможете поделиться исправлением со своей командой.
Другой вариант – форкнуть пакет, исправить ошибку и создать запрос на исправление. В этот момент вы можете обновить зависимости своего проекта и использовать свой форк до тех пор, пока сопровождающие пакета не одобрят его и не опубликуют новую версию.
"dependencies": {
"buggy-package": "your_user/buggy-package#bugfix"
}
Это выглядит хорошим вариантом, теперь члены вашей команды получат исправление, когда будут обновлять зависимости проекта. Недостатком является то, что вам придется поддерживать форк и следить за его актуальностью.
Есть ли у нас лучший вариант? Да, есть. Мы можем использовать команду yarn patch
, которая была введена в yarn v2.0.0. Она позволяет мгновенно вносить и поддерживать исправления в зависимостях без необходимости форка пакетов.
Возьмем в качестве примера пакет remix-run
. Во время разработки я обнаружил проблему с хранением сессий. Я открыл запрос на исправление, а затем исправил пакет прямо в проекте с помощью команды:
yarn patch @remix-run/node@npm:1.5.1
➤ YN0000: Package @remix-run/node@npm:1.5.1 got extracted with success!
➤ YN0000: You can now edit the following folder: /private/var/folders/xm/qntd4h_97zn6w88tc95bsvxc0000gp/T/xfs-bfc9a229/user
➤ YN0000: Once you are done run yarn patch-commit -s /private/var/folders/xm/qntd4h_97zn6w88tc95bsvxc0000gp/T/xfs-bfc9a229/user and Yarn will store a patchfile based on your changes.
➤ YN0000: Done in 0s 68ms
После извлечения пакета мы можем открыть созданную папку и внести туда наши изменения. Один недостаток заключается в том, что вам придется изменять производственный код, который может быть минифицирован и сложен для отладки. В моем случае это было простое изменение модуля fileStorage
.
Следующим шагом будет фиксация патча с помощью команды, отображаемой ранее в консоли
yarn patch-commit -s /private/var/folders/xm/qntd4h_97zn6w88tc95bsvxc0000gp/T/xfs-bfc9a229/user
На этом этапе мы должны увидеть следующее изменение в package.json
"resolutions": {
"@remix-run/node@1.5.1": "patch:@remix-run/node@npm:1.5.1#.yarn/patches/@remix-run-node-npm-1.5.1-51061cf212.patch"
}
и в .yarn/patches
вы найдете файл патча.
Преимущества использования этого подхода в том, что патч может быть рассмотрен вашей командой, и его применение не требует дополнительной работы по сравнению с форком. Это следует использовать для критических исправлений, если вам нужна новая функция, я бы предложил использовать форк вместо этого. Также не забудьте открыть проблему и создать запрос на исправление в фактическом пакете.