{"id":35357,"date":"2026-10-15T13:42:13","date_gmt":"2026-10-15T13:42:13","guid":{"rendered":"https:\/\/appricotsoft.com\/"},"modified":"2026-10-15T13:42:14","modified_gmt":"2026-10-15T13:42:14","slug":"zaleznosci-przechodnie-co-zawiera-kompilacja","status":"publish","type":"post","link":"https:\/\/appricotsoft.com\/pl\/blog\/zaleznosci-przechodnie-co-zawiera-kompilacja\/","title":{"rendered":"Zale\u017cno\u015bci przechodnie: dlaczego nikt nie wie, co zawiera kompilacja"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"35357\" class=\"elementor elementor-35357\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-22c95ae e-flex e-con-boxed e-con e-parent\" data-id=\"22c95ae\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8de11a8 elementor-widget elementor-widget-text-editor\" data-id=\"8de11a8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Zale\u017cno\u015bci przechodnie to pakiety, od kt\u00f3rych zale\u017c\u0105 twoje pakiety: dodajesz kilka bibliotek, a ka\u017cda z nich poci\u0105ga za sob\u0105 kolejne, kt\u00f3re z kolei poci\u0105gaj\u0105 za sob\u0105 kolejne. Wi\u0119kszo\u015b\u0107 tego drzewa jest nieszkodliwa, a sama liczba niewiele m\u00f3wi. Prawdziwym problemem nie jest to, ile masz po\u015brednich zale\u017cno\u015bci, ale to, \u017ce nikt z zespo\u0142u ich nie widzi i nikt ich nie wybra\u0142.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1c76ec6 elementor-widget elementor-widget-heading\" data-id=\"1c76ec6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Dlaczego zale\u017cno\u015bci przechodnie stanowi\u0105 problem widoczno\u015bci, a nie problem liczby<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e51aff7 elementor-widget elementor-widget-text-editor\" data-id=\"e51aff7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Otwarte <code>pakiet.json<\/code> W typowym projekcie frontendowym widzisz kr\u00f3tk\u0105, przejrzyst\u0105 list\u0119. To s\u0105 twoje bezpo\u015brednie zale\u017cno\u015bci \u2013 te, kt\u00f3re kto\u015b z zespo\u0142u postanowi\u0142 doda\u0107. Nast\u0119pnie otw\u00f3rz plik lockfile, a lista zamieni si\u0119 w dokument, po kt\u00f3rym b\u0119dziesz przewija\u0107 przez d\u0142ugi czas. Ta r\u00f3\u017cnica to drzewo zale\u017cno\u015bci: ka\u017cdy pakiet, kt\u00f3rego potrzebuj\u0105 twoje bezpo\u015brednie zale\u017cno\u015bci, oraz wszystko, czego z kolei potrzebuj\u0105 te pakiety.<\/p><p>Pierwsz\u0105 reakcj\u0105 jest zazwyczaj niepok\u00f3j, kt\u00f3ry w wi\u0119kszo\u015bci przypadk\u00f3w jest nieuzasadniony. Ekosystem npm opiera si\u0119 na niewielkich pakietach, kt\u00f3re realizuj\u0105 jedn\u0105 funkcj\u0119. Narz\u0119dzie do kompilacji, narz\u0119dzie do uruchamiania test\u00f3w oraz framework interfejsu u\u017cytkownika b\u0119d\u0105 korzysta\u0107 z parser\u00f3w, narz\u0119dzi do obs\u0142ugi \u015bcie\u017cek, polyfill\u00f3w i funkcji pomocniczych. Du\u017ca liczba zale\u017cno\u015bci npm wynika z samej konstrukcji ekosystemu i nie jest oznak\u0105, \u017ce co\u015b posz\u0142o nie tak.<\/p><p>To, co nie jest w porz\u0105dku i na co warto zwr\u00f3ci\u0107 uwag\u0119, to fakt, \u017ce \u017cadna z tych po\u015brednich zale\u017cno\u015bci nie zosta\u0142a poddana procesowi decyzyjnemu. Nikt z zespo\u0142u nie oceni\u0142 autora, historii utrzymania ani tego, co robi pakiet po zainstalowaniu. Ka\u017cdy z nich dzia\u0142a z takimi samymi uprawnieniami jak Tw\u00f3j w\u0142asny kod \u2013 w Twojej kompilacji, na komputerach Twoich programist\u00f3w oraz w \u015brodowisku CI. Pytanie nie brzmi wi\u0119c: \u2019dlaczego mamy ich tak wiele?\u201c, ale: \u201dkt\u00f3re z nich odrzuciliby\u015bmy, gdyby kto\u015b o to zapyta\u0142?\u201c.\u201d<\/p><p>To nowe spojrzenie pozwala r\u00f3wnie\u017c zrozumie\u0107, czym tak naprawd\u0119 jest nadmierne rozrost zale\u017cno\u015bci. Nie chodzi tu o du\u017ce drzewo. Chodzi o t\u0119 cz\u0119\u015b\u0107 drzewa, kt\u00f3ra zwi\u0119ksza ryzyko lub obci\u0105\u017cenie, nie zapewniaj\u0105c przy tym niczego, co jest ci potrzebne: duplikaty, porzucony kod oraz pakiety, kt\u00f3re podczas instalacji wykonuj\u0105 wi\u0119cej czynno\u015bci, ni\u017c wymaga tego ich zadanie.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ca49d85 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"ca49d85\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ab1f2f elementor-widget elementor-widget-heading\" data-id=\"7ab1f2f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Jak powstaje drzewo zale\u017cno\u015bci<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b6cecb4 elementor-widget elementor-widget-text-editor\" data-id=\"b6cecb4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Aby zrozumie\u0107 struktur\u0119 drzewa, warto wiedzie\u0107, w jaki spos\u00f3b mened\u017cer pakiet\u00f3w je tworzy.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a231863 elementor-widget elementor-widget-heading\" data-id=\"a231863\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Rozr\u00f3\u017cnianie wersji<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-92930c7 elementor-widget elementor-widget-text-editor\" data-id=\"92930c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Ka\u017cdy <code>pakiet.json<\/code> okre\u015bla zakresy, a nie konkretne wersje. <code>^4.2.0<\/code> oznacza \u201cdowoln\u0105 wersj\u0119 4.x, pocz\u0105wszy od 4.2.0\u201d. Podczas instalacji mened\u017cer pakiet\u00f3w przegl\u0105da graf, wybiera dla ka\u017cdego pakietu wersj\u0119 spe\u0142niaj\u0105c\u0105 zadeklarowane dla niego przedzia\u0142y i stara si\u0119 ponownie wykorzysta\u0107 t\u0119 sam\u0105 kopi\u0119 wsz\u0119dzie tam, gdzie przedzia\u0142y si\u0119 pokrywaj\u0105.<\/p><p>Gdy dwie cz\u0119\u015bci drzewa wymagaj\u0105 niekompatybilnych wersji tego samego pakietu, npm nie zg\u0142asza b\u0142\u0119du. Instaluje obie kopie, umieszczaj\u0105c drug\u0105 z nich w katalogu pakietu, kt\u00f3ry jej potrzebuje. Dlatego czasami w jednym projekcie mo\u017cna znale\u017a\u0107 dwie lub trzy wersje tej samej biblioteki.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c42d5d5 elementor-widget elementor-widget-heading\" data-id=\"c42d5d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Gdy nie da si\u0119 rozwi\u0105za\u0107 konfliktu<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5efed3c elementor-widget elementor-widget-text-editor\" data-id=\"5efed3c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Zagnie\u017cd\u017canie nie pomaga, gdy dozwolona jest tylko jedna kopia. Tak w\u0142a\u015bnie jest w przypadku zale\u017cno\u015bci r\u00f3wnorz\u0119dnych: wtyczka deklaruje: \u201cDzia\u0142am z wersj\u0105 frameworka X\u201d i oczekuje, \u017ce b\u0119dzie korzysta\u0107 z instancji frameworka, kt\u00f3r\u0105 aplikacja ju\u017c posiada, zamiast dostarcza\u0107 w\u0142asn\u0105. Wtyczka Vue nie mo\u017ce dostarcza\u0107 prywatnej kopii Vue; musi korzysta\u0107 z tej, na kt\u00f3rej dzia\u0142a aplikacja.<\/p><p>We\u017amy teraz dwie bezpo\u015brednie zale\u017cno\u015bci, z kt\u00f3rych ka\u017cda z osobna jest rozs\u0105dnym wyborem. Jedna okre\u015bla zakres r\u00f3wnorz\u0119dnych wersji dla starej g\u0142\u00f3wnej wersji biblioteki, a druga \u2013 dla nowej. Nie ma wersji, kt\u00f3ra spe\u0142nia\u0142aby oba warunki, i nie ma mo\u017cliwo\u015bci zainstalowania dw\u00f3ch, poniewa\u017c chodzi w\u0142a\u015bnie o to, by korzysta\u0107 z jednej. npm zatrzymuje si\u0119, zg\u0142aszaj\u0105c b\u0142\u0105d rozstrzygania zale\u017cno\u015bci. Pr\u00f3ba wymuszenia instalacji za pomoc\u0105 <code>--legacy-peer-deps<\/code> Lub <code>--force<\/code> to jedynie maskuje konflikt; jeden z tych dw\u00f3ch pakiet\u00f3w b\u0119dzie teraz dzia\u0142a\u0142 z wersj\u0105, kt\u00f3rej obs\u0142ugi nigdy nie deklarowa\u0142.<\/p><p>Rozwi\u0105zanie nigdy nie le\u017cy w drzewie. Jest to decyzja dotycz\u0105ca bezpo\u015brednich zale\u017cno\u015bci: zaktualizowa\u0107, zast\u0105pi\u0107 lub poczeka\u0107 na opiekuna projektu. W\u0142a\u015bnie dlatego takie konflikty wydaj\u0105 si\u0119 niemo\u017cliwe do rozwi\u0105zania: blokuje ci\u0119 wyb\u00f3r, kt\u00f3rego dokona\u0142 kto\u015b inny w kodzie, nad kt\u00f3rym nie masz kontroli.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3bd2274 elementor-widget elementor-widget-heading\" data-id=\"3bd2274\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Co faktycznie zawiera plik blokady<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e542582 elementor-widget elementor-widget-text-editor\" data-id=\"e542582\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Plik blokuj\u0105cy (<code>package-lock.json<\/code>, <code>yarn.lock<\/code>, Lub <code>pnpm-lock.yaml<\/code>) to zapis wynikaj\u0105cy z tej decyzji. Dla ka\u017cdego pakietu w drzewie \u2014 zar\u00f3wno bezpo\u015bredniego, jak i po\u015bredniego \u2014 zawiera on informacj\u0119 o dok\u0142adnej wybranej wersji, \u017ar\u00f3dle pobrania oraz skr\u00f3cie integralno\u015bci jego zawarto\u015bci. W pliku lockfile npm zaznacza si\u0119 r\u00f3wnie\u017c pakiety, kt\u00f3re deklaruj\u0105 skrypty instalacyjne.<\/p><p>Ma to dwie konsekwencje:<\/p><ul><li><strong>Zapisz to.<\/strong> Bez pliku blokuj\u0105cego dw\u00f3ch programist\u00f3w instaluj\u0105cych oprogramowanie w odst\u0119pie jednego dnia mo\u017ce uzyska\u0107 r\u00f3\u017cne zale\u017cno\u015bci po\u015brednie, poniewa\u017c zakresy s\u0105 rozpoznawane jako najnowsze dost\u0119pne w danym momencie. Dzi\u0119ki temu plikowi ka\u017cdy u\u017cytkownik i ka\u017cde uruchomienie CI otrzymuje t\u0119 sam\u0105 struktur\u0119 drzewa.<\/li><li><strong>Zainstaluj to w ramach CI.<\/strong> <code>npm ci<\/code> instaluje dok\u0142adnie to, co okre\u015bla plik blokady, a je\u015bli zawarto\u015b\u0107 pliku nie jest zgodna, operacja ko\u0144czy si\u0119 niepowodzeniem <code>pakiet.json<\/code>. <code>npm install<\/code> mo\u017ce to po cichu zaktualizowa\u0107.<\/li><\/ul><p>Plik blokuj\u0105cy to r\u00f3wnie\u017c najbardziej rzetelny spis zawarto\u015bci kompilacji. Je\u015bli chcesz wiedzie\u0107, co znajduje si\u0119 w kompilacji, to w\u0142a\u015bnie ten plik zawiera odpowied\u017a, a nie <code>pakiet.json<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9cd30e4 elementor-widget elementor-widget-heading\" data-id=\"9cd30e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Analiza drzewa<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2141a8d elementor-widget elementor-widget-text-editor\" data-id=\"2141a8d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Aby zacz\u0105\u0107, nie potrzebujesz \u017cadnych dodatkowych narz\u0119dzi:<\/p><table><thead><tr><th>Pytanie<\/th><th>Polecenie<\/th><\/tr><\/thead><tbody><tr><td>Co pobieraj\u0105 moje bezpo\u015brednie zale\u017cno\u015bci?<\/td><td><code>npm ls --all<\/code><\/td><\/tr><tr><td>Dlaczego w og\u00f3le ten pakiet si\u0119 tu znalaz\u0142?<\/td><td><code>npm explain<\/code><\/td><\/tr><tr><td>Ile mam tego egzemplarzy?<\/td><td><code>npm ls<\/code><\/td><\/tr><tr><td>Czy mo\u017cna po\u0142\u0105czy\u0107 duplikaty?<\/td><td><code>npm dedupe<\/code><\/td><\/tr><tr><td>Co uznaje si\u0119 za podatne na zagro\u017cenia?<\/td><td><code>audyt npm<\/code><\/td><\/tr><tr><td>Eksportuj formalny spis inwentarza<\/td><td><code>npm sbom --sbom-format cyclonedx<\/code><\/td><\/tr><\/tbody><\/table><p><code>npm explain<\/code> jest tym, z czego zespo\u0142y zbyt rzadko korzystaj\u0105. Daje odpowied\u017a na najbardziej praktyczne pytanie pojawiaj\u0105ce si\u0119 podczas ka\u017cdego audytu zale\u017cno\u015bci: kt\u00f3re z naszych w\u0142asnych wybor\u00f3w spowodowa\u0142o, \u017ce ten pakiet si\u0119 tu znalaz\u0142.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e936dd1 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"e936dd1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eec0faf elementor-widget elementor-widget-heading\" data-id=\"eec0faf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przyk\u0142ad z naszej praktyki<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-875c7c5 elementor-widget elementor-widget-text-editor\" data-id=\"875c7c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"https:\/\/appricotsoft.com\/pl\/studia-przypadkow\/linkster\/\"><strong>Linkster<\/strong><\/a> to generator mikro stron i cyfrowych wizyt\u00f3wek, nie wymagaj\u0105cy programowania, przeznaczony dla przedsi\u0119biorc\u00f3w i ma\u0142ych firm, stworzony dla klienta z Tallina w Estonii. Opracowali\u015bmy go od podstaw w oparciu o Vue.js.<\/p><p>Taki produkt frontendowy stanowi najdobrze zrozumia\u0142\u0105 ilustracj\u0119 tego zagadnienia, jak\u0105 znamy. Nie ma w nim nic niezwyk\u0142ego, je\u015bli chodzi o zale\u017cno\u015bci. Kilka bezpo\u015brednich wybor\u00f3w (framework, routing, stan, narz\u0119dzie do kompilacji, konfiguracja testowa) rutynowo przek\u0142ada si\u0119 na setki po\u015brednich zale\u017cno\u015bci, co jest oczekiwanym rezultatem, a nie sygna\u0142em ostrzegawczym. Nikt z zespo\u0142u nie zapozna\u0142 si\u0119 z kodem wi\u0119kszo\u015bci tych pakiet\u00f3w, co jest normalnym stanem ka\u017cdego nowoczesnego frontendu.<\/p><p>Zatem przydatne nawyki dotycz\u0105 raczej widoczno\u015bci ni\u017c ograniczania:<\/p><ul><li>Plik lockfile stanowi cz\u0119\u015b\u0107 repozytorium i podlega recenzji tak samo jak ka\u017cdy inny plik. Pull request, kt\u00f3ry dodaje jedn\u0105 bezpo\u015bredni\u0105 zale\u017cno\u015b\u0107, ale zmienia znaczn\u0105 cz\u0119\u015b\u0107 pliku lockfile, stanowi sygna\u0142, \u017ce nale\u017cy przyjrze\u0107 si\u0119 temu bli\u017cej.<\/li><li>Dodanie bezpo\u015bredniej zale\u017cno\u015bci to drobna decyzja, kt\u00f3ra rodzi szereg pyta\u0144: kto j\u0105 utrzymuje, kiedy ukaza\u0142a si\u0119 jej ostatnia wersja i co wnosi?<\/li><li>Kiedy drzewo wymaga opieki, zaczynamy od <code>npm explain<\/code> i prze\u015bledzi\u0107 drog\u0119 przesy\u0142ki a\u017c do konkretnego wyboru, kt\u00f3ry doprowadzi\u0142 do jej powstania, poniewa\u017c tylko na tym poziomie mo\u017cemy faktycznie co\u015b zmieni\u0107.<\/li><\/ul><p>\u017badna z tych kwestii nie spowolni\u0142a realizacji projektu o napi\u0119tym harmonogramie. Odbywa si\u0119 to w momencie dodania zale\u017cno\u015bci, kiedy po\u015bwi\u0119cenie minuty na sprawdzenie nie stanowi problemu, a nie w ramach oddzielnego projektu porz\u0105dkuj\u0105cego przeprowadzanego p\u00f3\u017aniej.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-79f030a elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"79f030a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fac56a1 elementor-widget elementor-widget-heading\" data-id=\"fac56a1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">O czym nale\u017cy pami\u0119ta\u0107: co usun\u0105\u0107, a co pozostawi\u0107 bez zmian<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2d8054 elementor-widget elementor-widget-text-editor\" data-id=\"f2d8054\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Audyt zale\u017cno\u015bci jest przydatny, gdy skutkuje sporz\u0105dzeniem kr\u00f3tkiej listy konkretnych dzia\u0142a\u0144. Jest szkodliwy, gdy przeradza si\u0119 w kampani\u0119 maj\u0105c\u0105 na celu zmniejszenie liczby.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a37e5c3 elementor-widget elementor-widget-heading\" data-id=\"a37e5c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Warto to usun\u0105\u0107<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-de80f49 elementor-widget elementor-widget-text-editor\" data-id=\"de80f49\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Porzucone paczki.<\/strong> Brak nowych wersji, nierozwi\u0105zane problemy, archiwizowane lub nieistniej\u0105ce repozytorium. Ryzyko nie polega na tym, \u017ce kod jest dzi\u015b wadliwy, ale na tym, \u017ce nikt go nie naprawi, gdy tak si\u0119 stanie. Je\u015bli bezpo\u015brednia zale\u017cno\u015b\u0107 wi\u0105\u017ce si\u0119 z porzuconym kodem, poszukaj alternatywnego rozwi\u0105zania, kt\u00f3re jest nadal rozwijane.<\/li><li><strong>Duplikaty tej samej funkcji.<\/strong> Trzy biblioteki dat lub dwa klienty HTTP zazwyczaj oznaczaj\u0105, \u017ce trzy osoby rozwi\u0105za\u0142y ten sam problem w r\u00f3\u017cnym czasie. Wybierz jedn\u0105 z nich i przeprowad\u017a migracj\u0119.<\/li><li><strong>Pakiety zawieraj\u0105ce skrypty instalacyjne, kt\u00f3rych nie potrzebujesz.<\/strong> <code>wst\u0119pna instalacja<\/code> I <code>po instalacji<\/code> Skrypty instalacyjne uruchamiaj\u0105 dowolny kod na ka\u017cdym komputerze, na kt\u00f3rym instalowany jest projekt. Niekt\u00f3re pakiety ich wymagaj\u0105, na przyk\u0142ad w celu pobrania natywnego pliku binarnego. Wiele innych ich nie potrzebuje. Sprawd\u017a, kt\u00f3re wpisy w pliku blokady s\u0105 oznaczone jako posiadaj\u0105ce skrypty instalacyjne, i zastan\u00f3w si\u0119, czy w przypadku ka\u017cdego z nich istnieje ku temu uzasadnienie. W przypadku CI rozwa\u017c instalacj\u0119 za pomoc\u0105 <code>--ignoruj-skrypty<\/code> i zezwalaj\u0105c tylko na te, kt\u00f3rych potrzebujesz.<\/li><li><strong>Bezpo\u015brednie zale\u017cno\u015bci, kt\u00f3re wykonuj\u0105 jedn\u0105 prost\u0105 czynno\u015b\u0107.<\/strong> Pakiet, kt\u00f3ry otacza pojedynczy wiersz kodu z biblioteki standardowej, stanowi pe\u0142ny punkt wej\u015bcia do \u0142a\u0144cucha dostaw, nie przynosz\u0105c przy tym prawie \u017cadnych korzy\u015bci.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f6b4a94 elementor-widget elementor-widget-heading\" data-id=\"f6b4a94\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Nie warto tego usuwa\u0107<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-be84ee3 elementor-widget elementor-widget-text-editor\" data-id=\"be84ee3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Ma\u0142e, zadbane obiekty infrastruktury w g\u0142\u0119bi lasu.<\/strong> Usuni\u0119cie ich zazwyczaj wi\u0105\u017ce si\u0119 z utworzeniem rozga\u0142\u0119zienia lub zast\u0105pieniem bezpo\u015bredniej zale\u017cno\u015bci, z kt\u00f3rej intensywnie korzystasz, a korzy\u015b\u0107 z tego wynikaj\u0105ca jest niezauwa\u017calna dla nikogo.<\/li><li><strong>Wszystko, co trzeba by obej\u015b\u0107.<\/strong> Zast\u0119powanie zale\u017cno\u015bci po\u015brednich (<code>nadpisania<\/code> (w npm) to skuteczne narz\u0119dzie s\u0142u\u017c\u0105ce do wprowadzania konkretnych poprawek bezpiecze\u0144stwa, a nie do porz\u0105dkowania kodu.<\/li><li><strong>Paczki wybrane wy\u0142\u0105cznie ze wzgl\u0119du na ich rozmiar.<\/strong> Rozmiar to ma\u0142o miarodajny wska\u017anik. Ma\u0142y pakiet, za kt\u00f3rym stoi tylko jeden anonimowy opiekun, mo\u017ce stanowi\u0107 wi\u0119ksze ryzyko ni\u017c du\u017cy pakiet, za kt\u00f3rym stoi aktywny zesp\u00f3\u0142.<\/li><\/ul><p>Najlepszym kryterium oceny ka\u017cdego pakietu jest to, czy ma on aktywnego autora: kogo\u015b, kto publikuje aktualizacje, odpowiada na zg\u0142oszenia i zauwa\u017cy\u0142by, gdyby z jego konta opublikowano co\u015b nieoczekiwanego. To ma wi\u0119ksze znaczenie ni\u017c liczba wierszy kodu.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-83d697a elementor-widget elementor-widget-heading\" data-id=\"83d697a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">W jaki spos\u00f3b wi\u0105\u017ce si\u0119 to z atakami na \u0142a\u0144cuch dostaw i SBOM<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2563c25 elementor-widget elementor-widget-text-editor\" data-id=\"2563c25\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Ataki na \u0142a\u0144cuch dostaw rzadko s\u0105 wymierzone w biblioteki, kt\u00f3re sam wybra\u0142e\u015b. Ich celem s\u0105 te, kt\u00f3rych nie zauwa\u017cy\u0142e\u015b: przej\u0119te konto opiekuna ma\u0142ego pakietu po\u015bredniego, z\u0142o\u015bliwy skrypt instalacyjny, nazwa \u0142udz\u0105co podobna. Po\u015brednie zale\u017cno\u015bci s\u0105 atrakcyjne w\u0142a\u015bnie dlatego, \u017ce nikt ich nie sprawdza.<\/p><p>SBOM (lista komponent\u00f3w oprogramowania) stanowi formaln\u0105 odpowied\u017a na pytanie \u201cco zawiera dana kompilacja\u201d. Zawiera te same informacje co plik lockfile, ale w standardowym formacie, kt\u00f3ry mog\u0105 odczyta\u0107 narz\u0119dzia skanuj\u0105ce i klienci. Jego warto\u015b\u0107 polega na tym, \u017ce jest on gotowy ju\u017c w dniu pojawienia si\u0119 nowego komunikatu, dzi\u0119ki czemu w ci\u0105gu kilku minut mo\u017cna sprawdzi\u0107, czy dotyczy on danej organizacji.<\/p><p>Traktuj kod stron trzecich tak samo, jak traktujesz ka\u017cdy system zewn\u0119trzny. Nasz artyku\u0142 na temat <a href=\"https:\/\/appricotsoft.com\/pl\/blog\/modelowanie-zagrozen-dla-malych-zespolow\/\"><strong>modelowanie zagro\u017ce\u0144 dla ma\u0142ych zespo\u0142\u00f3w<\/strong><\/a> opisuje, jak wyznaczy\u0107 granice zaufania wok\u00f3\u0142 wszystkiego, co wykonuje kod, kt\u00f3rego nie jeste\u015b w\u0142a\u015bcicielem, a ta sama zasada ma zastosowanie do drzewa zale\u017cno\u015bci. Jak argumentujemy w <a href=\"https:\/\/appricotsoft.com\/pl\/blog\/decyzje-dotyczace-bezpieczenstwa-od-samego-poczatku-ktore-sa-bezplatne\/\"><strong>Bezpiecze\u0144stwo od samego pocz\u0105tku<\/strong><\/a>, sprawdzanie zale\u017cno\u015bci to mechanizm, kt\u00f3ry mo\u017cna doda\u0107 p\u00f3\u017aniej; decyzj\u0119, kt\u00f3r\u0105 warto podj\u0105\u0107 ju\u017c na wczesnym etapie, dotyczy mniejszej liczby, ale lepiej dobranych bezpo\u015brednich zale\u017cno\u015bci.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-87e4202 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"87e4202\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8ada43a elementor-widget elementor-widget-heading\" data-id=\"8ada43a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Wniosek<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a898a12 elementor-widget elementor-widget-text-editor\" data-id=\"a898a12\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Zale\u017cno\u015bci przechodnie nie stanowi\u0105 problemu, poniewa\u017c jest ich wiele. Staj\u0105 si\u0119 problemem dopiero wtedy, gdy s\u0105 niewidoczne. Zapisz plik blokady, zainstaluj system na jego podstawie, naucz si\u0119 \u015bledzi\u0107 pochodzenie ka\u017cdego pakietu a\u017c do bezpo\u015bredniego wyboru, kt\u00f3ry go wprowadzi\u0142, i po\u015bwi\u0119\u0107 czas na audyt porzuconych pakiet\u00f3w, duplikat\u00f3w oraz skrypt\u00f3w instalacyjnych, a nie na liczenie ich \u0142\u0105cznej liczby. Ka\u017cd\u0105 zale\u017cno\u015b\u0107 oceniaj pod k\u0105tem tego, czy kto\u015b nadal j\u0105 utrzymuje. Je\u015bli chcesz mie\u0107 zesp\u00f3\u0142, kt\u00f3ry tworzy produkty z zachowaniem tych nawyk\u00f3w od pierwszego zatwierdzenia, zapoznaj si\u0119 z naszym <a href=\"https:\/\/appricotsoft.com\/pl\/tworzenie-oprogramowania-na-zamowienie\/\"><strong>tworzenie oprogramowania na zam\u00f3wienie<\/strong><\/a> us\u0142ugi.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f9c6158 elementor-cta--skin-cover elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"f9c6158\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-cta\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg\" style=\"background-image: url(https:\/\/appricotsoft.com\/wp-content\/plugins\/elementor\/assets\/images\/placeholder.png);\" role=\"img\" aria-label=\"\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h2 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tMasz ju\u017c ten pomys\u0142?\t\t\t\t\t<\/h2>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__description elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tNapisz do nas, a znajdziemy najlepszy spos\u00f3b realizacji Twojego pomys\u0142u!\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t<a class=\"elementor-cta__button elementor-button elementor-size-\" href=\"\/pl\/skontaktuj-sie-z-nami\/\">\n\t\t\t\t\t\tSkontaktuj si\u0119 z nami\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Spokojne wyja\u015bnienie zale\u017cno\u015bci przechodnich: dlaczego liczba wzrasta gwa\u0142townie, co tak naprawd\u0119 pokazuje plik blokady i kt\u00f3re pakiety warto usun\u0105\u0107 z drzewa.<\/p>","protected":false},"author":4,"featured_media":35360,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"content-type":"","footnotes":""},"categories":[44],"tags":[],"class_list":["post-35357","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Transitive Dependencies: Why Nobody Knows What Is in the Build - Appricotsoft<\/title>\n<meta name=\"description\" content=\"Transitive dependencies explained calmly: why the count explodes, what a lockfile really shows, and which packages are worth removing from the tree.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/appricotsoft.com\/pl\/blog\/zaleznosci-przechodnie-co-zawiera-kompilacja\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transitive Dependencies: Why Nobody Knows What Is in the Build - Appricotsoft\" \/>\n<meta property=\"og:description\" content=\"Transitive dependencies explained calmly: why the count explodes, what a lockfile really shows, and which packages are worth removing from the tree.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/appricotsoft.com\/pl\/blog\/zaleznosci-przechodnie-co-zawiera-kompilacja\/\" \/>\n<meta property=\"og:site_name\" content=\"Appricotsoft\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-15T13:42:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-15T13:42:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/10\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Roman Rusnak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Roman Rusnak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/\"},\"author\":{\"name\":\"Roman Rusnak\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#\\\/schema\\\/person\\\/635e2d8baeeff5a86ba1944e42d3a30b\"},\"headline\":\"Transitive Dependencies: Why Nobody Knows What Is in the Build\",\"datePublished\":\"2026-10-15T13:42:13+00:00\",\"dateModified\":\"2026-10-15T13:42:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/\"},\"wordCount\":1765,\"publisher\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/\",\"name\":\"Transitive Dependencies: Why Nobody Knows What Is in the Build - Appricotsoft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp\",\"datePublished\":\"2026-10-15T13:42:13+00:00\",\"dateModified\":\"2026-10-15T13:42:14+00:00\",\"description\":\"Transitive dependencies explained calmly: why the count explodes, what a lockfile really shows, and which packages are worth removing from the tree.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#primaryimage\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp\",\"contentUrl\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp\",\"width\":1920,\"height\":1280,\"caption\":\"transitive-dependencies-what-is-in-the-build\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/blog\\\/transitive-dependencies-what-is-in-the-build\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/appricotsoft.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transitive Dependencies: Why Nobody Knows What Is in the Build\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#website\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/\",\"name\":\"Appricotsoft\",\"description\":\"We Build Products That Win Funding And Scale\",\"publisher\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/appricotsoft.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#organization\",\"name\":\"Appricotsoft\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/cropped-cropped-appricot-logo-1.png\",\"contentUrl\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/cropped-cropped-appricot-logo-1.png\",\"width\":588,\"height\":208,\"caption\":\"Appricotsoft\"},\"image\":{\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"description\":\"Appricotsoft is a European software development company headquartered in Warsaw, Poland. We design and build mobile apps, web platforms, MVPs and AI-powered products for startups and SMEs across Europe, with deep expertise in hospitality and fintech.\",\"slogan\":\"We build products that win funding and scale\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/appricotsoft\",\"https:\\\/\\\/clutch.co\\\/profile\\\/appricotsoft\",\"https:\\\/\\\/www.goodfirms.co\\\/company\\\/appricotsoft\",\"https:\\\/\\\/www.facebook.com\\\/appricotsoft\\\/\",\"https:\\\/\\\/www.instagram.com\\\/appricotsoft\\\/\"],\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"Mlynarska 8\\\/12, loc. 40\",\"postalCode\":\"01-194\",\"addressLocality\":\"Warsaw\",\"addressCountry\":\"PL\"},\"contactPoint\":{\"@type\":\"ContactPoint\",\"telephone\":\"+48 571 785 777\",\"contactType\":\"sales\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/contact-us\\\/\",\"availableLanguage\":[\"English\",\"Polish\",\"Ukrainian\"]},\"knowsAbout\":[\"mobile app development\",\"MVP development\",\"hospitality software\",\"fintech software development\",\"payment gateway integration\",\"AI solutions\",\"UX\\\/UI design\",\"software quality assurance\"],\"areaServed\":[\"Europe\",\"United Kingdom\",\"Germany\",\"Netherlands\",\"Poland\",\"Nordics\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/#\\\/schema\\\/person\\\/635e2d8baeeff5a86ba1944e42d3a30b\",\"name\":\"Roman Rusnak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/litespeed\\\/avatar\\\/73937431edf197f3ec4ea2472b3940b1.jpg?ver=1791921581\",\"url\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/litespeed\\\/avatar\\\/73937431edf197f3ec4ea2472b3940b1.jpg?ver=1791921581\",\"contentUrl\":\"https:\\\/\\\/appricotsoft.com\\\/wp-content\\\/litespeed\\\/avatar\\\/73937431edf197f3ec4ea2472b3940b1.jpg?ver=1791921581\",\"caption\":\"Roman Rusnak\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zale\u017cno\u015bci przechodnie: dlaczego nikt nie wie, co zawiera kompilacja \u2013 Appricotsoft","description":"Spokojne wyja\u015bnienie zale\u017cno\u015bci przechodnich: dlaczego liczba wzrasta gwa\u0142townie, co tak naprawd\u0119 pokazuje plik blokady i kt\u00f3re pakiety warto usun\u0105\u0107 z drzewa.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/appricotsoft.com\/pl\/blog\/zaleznosci-przechodnie-co-zawiera-kompilacja\/","og_locale":"pl_PL","og_type":"article","og_title":"Transitive Dependencies: Why Nobody Knows What Is in the Build - Appricotsoft","og_description":"Transitive dependencies explained calmly: why the count explodes, what a lockfile really shows, and which packages are worth removing from the tree.","og_url":"https:\/\/appricotsoft.com\/pl\/blog\/zaleznosci-przechodnie-co-zawiera-kompilacja\/","og_site_name":"Appricotsoft","article_published_time":"2026-10-15T13:42:13+00:00","article_modified_time":"2026-10-15T13:42:14+00:00","og_image":[{"width":1920,"height":1280,"url":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/10\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp","type":"image\/webp"}],"author":"Roman Rusnak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Roman Rusnak","Szacowany czas czytania":"8 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#article","isPartOf":{"@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/"},"author":{"name":"Roman Rusnak","@id":"https:\/\/appricotsoft.com\/#\/schema\/person\/635e2d8baeeff5a86ba1944e42d3a30b"},"headline":"Transitive Dependencies: Why Nobody Knows What Is in the Build","datePublished":"2026-10-15T13:42:13+00:00","dateModified":"2026-10-15T13:42:14+00:00","mainEntityOfPage":{"@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/"},"wordCount":1765,"publisher":{"@id":"https:\/\/appricotsoft.com\/#organization"},"image":{"@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#primaryimage"},"thumbnailUrl":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/10\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp","articleSection":["Blog"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/","url":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/","name":"Zale\u017cno\u015bci przechodnie: dlaczego nikt nie wie, co zawiera kompilacja \u2013 Appricotsoft","isPartOf":{"@id":"https:\/\/appricotsoft.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#primaryimage"},"image":{"@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#primaryimage"},"thumbnailUrl":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/10\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp","datePublished":"2026-10-15T13:42:13+00:00","dateModified":"2026-10-15T13:42:14+00:00","description":"Spokojne wyja\u015bnienie zale\u017cno\u015bci przechodnich: dlaczego liczba wzrasta gwa\u0142townie, co tak naprawd\u0119 pokazuje plik blokady i kt\u00f3re pakiety warto usun\u0105\u0107 z drzewa.","breadcrumb":{"@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#primaryimage","url":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/10\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp","contentUrl":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/10\/transitive-dependencies-what-is-in-the-build-2-article-1920x1280-1.webp","width":1920,"height":1280,"caption":"transitive-dependencies-what-is-in-the-build"},{"@type":"BreadcrumbList","@id":"https:\/\/appricotsoft.com\/blog\/transitive-dependencies-what-is-in-the-build\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/appricotsoft.com\/"},{"@type":"ListItem","position":2,"name":"Transitive Dependencies: Why Nobody Knows What Is in the Build"}]},{"@type":"WebSite","@id":"https:\/\/appricotsoft.com\/#website","url":"https:\/\/appricotsoft.com\/","name":"Appricotsoft","description":"Tworzymy produkty, kt\u00f3re zdobywaj\u0105 finansowanie i skaluj\u0105 si\u0119","publisher":{"@id":"https:\/\/appricotsoft.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/appricotsoft.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/appricotsoft.com\/#organization","name":"Appricotsoft","url":"https:\/\/appricotsoft.com\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/appricotsoft.com\/#\/schema\/logo\/image\/","url":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/05\/cropped-cropped-appricot-logo-1.png","contentUrl":"https:\/\/appricotsoft.com\/wp-content\/uploads\/2026\/05\/cropped-cropped-appricot-logo-1.png","width":588,"height":208,"caption":"Appricotsoft"},"image":{"@id":"https:\/\/appricotsoft.com\/#\/schema\/logo\/image\/"},"description":"Appricotsoft to europejska firma zajmuj\u0105ca si\u0119 tworzeniem oprogramowania z siedzib\u0105 w Warszawie. Projektujemy i tworzymy aplikacje mobilne, platformy internetowe, MVP oraz produkty oparte na sztucznej inteligencji dla startup\u00f3w i M\u015aP w ca\u0142ej Europie, specjalizuj\u0105c si\u0119 w bran\u017cy hotelarskiej i fintech.","slogan":"We build products that win funding and scale","sameAs":["https:\/\/www.linkedin.com\/company\/appricotsoft","https:\/\/clutch.co\/profile\/appricotsoft","https:\/\/www.goodfirms.co\/company\/appricotsoft","https:\/\/www.facebook.com\/appricotsoft\/","https:\/\/www.instagram.com\/appricotsoft\/"],"address":{"@type":"PostalAddress","streetAddress":"Mlynarska 8\/12, loc. 40","postalCode":"01-194","addressLocality":"Warsaw","addressCountry":"PL"},"contactPoint":{"@type":"ContactPoint","telephone":"+48 571 785 777","contactType":"sales","url":"https:\/\/appricotsoft.com\/contact-us\/","availableLanguage":["English","Polish","Ukrainian"]},"knowsAbout":["mobile app development","MVP development","hospitality software","fintech software development","payment gateway integration","AI solutions","UX\/UI design","software quality assurance"],"areaServed":["Europe","United Kingdom","Germany","Netherlands","Poland","Nordics"]},{"@type":"Person","@id":"https:\/\/appricotsoft.com\/#\/schema\/person\/635e2d8baeeff5a86ba1944e42d3a30b","name":"Roman Rusnak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/appricotsoft.com\/wp-content\/litespeed\/avatar\/73937431edf197f3ec4ea2472b3940b1.jpg?ver=1791921581","url":"https:\/\/appricotsoft.com\/wp-content\/litespeed\/avatar\/73937431edf197f3ec4ea2472b3940b1.jpg?ver=1791921581","contentUrl":"https:\/\/appricotsoft.com\/wp-content\/litespeed\/avatar\/73937431edf197f3ec4ea2472b3940b1.jpg?ver=1791921581","caption":"Roman Rusnak"}}]}},"_links":{"self":[{"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/posts\/35357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/comments?post=35357"}],"version-history":[{"count":2,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/posts\/35357\/revisions"}],"predecessor-version":[{"id":35359,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/posts\/35357\/revisions\/35359"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/media\/35360"}],"wp:attachment":[{"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/media?parent=35357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/categories?post=35357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appricotsoft.com\/pl\/wp-json\/wp\/v2\/tags?post=35357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}