Jediny nefusersky pristup v pripade pouzivania 3rd party komponentov je nechat 3rd party komponenty 3rd party komponentami a nesahat do nich. Ak sa do nich saha, tak to maju byt zmeny, ktore opravuju alebo rozsiruju funkcionalitu 3rd party komponentu ako takeho *a tieto potom pretlacit do upstreamu*. Zdrojovy kod 3rd party komponentu nie je miesto na aplikovanie vendor-specific hackov. Tie treba drzat mimo komponentu (nad jeho verejnym API).
Cokolvek menej striktne ako takyto pristup je cisto cista a nefalsovana fuserina a skor ci neskor sa vypomsti. Intenzita pomsty a naklady na splatenie "tech debtu" potom rastu s invazivnostou, lajdackostou prevedenia zmeny, vseobecnej exponovanosti 3rd party komponentu, jeho komplexitou a dolezitostou dalsej existencie kodu, ktory tak ucinil. Nie je ale otazkou toho, ci. Spravna otazka je: kedy.
A little copying is better than a little dependency. (Go proverb)
Závislosti v js (node.js) jsou docela peklo, zvláště pokud se o vyvíjený produkt nemůžete starat kontinuálně, ale dostanete se k tomu tak 3-4x do roka. To kam došel npm ekosystém hraničí s neudržitelností, i relativně malé projekty mají i tisíce závislostí, kolikrát jeden modul i v několika verzích. Velice často ty moduly mají do 100 řádků a z nějakého neznámého důvodu autoři s oblibou kompletně mění API. Takže když chcete po půl roce aktualizovat verze (třeba i z nějakých bezpečnostních důvodů), donutí vás to významně zasáhnout do aplikace. Proti tomu je práce se standardní knihovnou Go vysvobození, aktualizujete na novou verzi a vše jede jak má. V používaných knihovnách se API mění jen opravdu výjimečně.
Od toho máš právě možnost udělat fork cizí knihovny a přidat si tam vlastní úpravy nebo něco opravit (pokud to původní autor nechce přijmout do hlavní větve nebo už se o projekt nestará). Pak používáš pořád knihovnu (tzn. v tomto výzkumu by se to neobjevilo jako duplicita, protože je to fork) a přitom nejsi závislý na někom jiném.
A pokud bude žádoucí změnu zpropagovat do jiné větve, pomůže ti s tím verzovací systém (merge, cherry-pick).
A pokud bys ten kód místo forku zkopíroval, tak ho udržovat nemusíš?
Kopírování dává smysl v případě, že bys z velké knihovny potřeboval malý kousek kódu. Ale i v takovém případě by šlo hledat čistější řešení – např. usilovat o rozdělení knihovny na menší modul (resp. knihovny by se takhle už měly navrhovat) nebo použít jinou knihovnu, která není tak rozsáhlá.
=======
např. usilovat o rozdělení knihovny na menší modul (resp. knihovny by se takhle už měly navrhovat)
=======
Hodně štěstí ve takovém vyjednávání s autorem knihovny. Zkoušel jsi to někdy? Párkrát jsem se pokoušel přesvědčit autory větších projektů o větší flexibilitu a skončilo to "forkni si to a u sebe si dělej, co potřebuješ". A celkem je i chápu, dělají to především pro vlastní potřebu a moje úpravy by jim konkrétně nijak nepomohly.