{"id":3564,"date":"2022-01-05T08:16:52","date_gmt":"2022-01-05T08:16:52","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/"},"modified":"2026-04-28T14:05:35","modified_gmt":"2026-04-28T14:05:35","slug":"modularyzacja-ruby-on-rails-z-packwerk-odcinek-i","status":"publish","type":"post","link":"https:\/\/thecodest.co\/pl\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/","title":{"rendered":"Modularyzacja Ruby on Rails za pomoc\u0105 Packwerk Episode I"},"content":{"rendered":"<h2>Wprowadzenie<\/h2>\n<p>Aby porozmawia\u0107 o <strong>Packwerk<\/strong>Musimy jednak najpierw wprowadzi\u0107 kilka poj\u0119\u0107.<\/p>\n<ul>\n<li><b>Sp\u00f3jno\u015b\u0107<\/b>odnosi si\u0119 do miary tego, jak bardzo elementy w module lub klasie nale\u017c\u0105 do siebie.<\/li>\n<li><b>Sprz\u0119g\u0142o<\/b>odnosi si\u0119 do poziomu zale\u017cno\u015bci mi\u0119dzy modu\u0142ami lub klasami.<\/li>\n<li><b>Granice<\/b>odnosi si\u0119 do barier mi\u0119dzy <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/what-is-code-refactoring\/\">kod<\/a>. W tym przypadku granica kodu odnosi si\u0119 do r\u00f3\u017cnych domen w ramach tej samej bazy kodu.<\/li>\n<li><b>Modularyzacja<\/b>Proces dzielenia systemu oprogramowania na wiele oddzielnych modu\u0142\u00f3w, z kt\u00f3rych ka\u017cdy dzia\u0142a niezale\u017cnie.<\/li>\n<\/ul>\n<h2>Problemy<\/h2>\n<p>Jak wiemy, <strong><a href=\"https:\/\/thecodest.co\/pl\/blog\/hire-ror-developer\/\">Ruby<\/a><\/strong> nie zapewnia dobrego rozwi\u0105zania do egzekwowania granic kodu. Mo\u017cemy okre\u015bli\u0107 widoczno\u015b\u0107, ale wszystkie zale\u017cno\u015bci zostan\u0105 za\u0142adowane do globalnej przestrzeni nazw. W du\u017cych lub monolitycznych aplikacjach ten brak granic powoduje nast\u0119puj\u0105ce problemy.<\/p>\n<ul>\n<li>Niska sp\u00f3jno\u015b\u0107,<\/li>\n<li>Wysokie sprz\u0119\u017cenie, <\/li>\n<li>Kod spaghetti.<\/li>\n<\/ul>\n<p>Pr\u00f3buj\u0105c modularyzowa\u0107 monolit Shopify i egzekwowa\u0107 granice, pr\u00f3bowali r\u00f3\u017cnych rozwi\u0105za\u0144, nie osi\u0105gaj\u0105c oczekiwanych rezultat\u00f3w:<br \/>\n- Ustawianie sta\u0142ych prywatnych,<br \/>\n- Ustalanie granic za pomoc\u0105 klejnot\u00f3w,<br \/>\n- Korzystanie z test\u00f3w w celu zapobiegania powi\u0105zaniom mi\u0119dzy komponentami,<br \/>\n- Korzystanie z modulacji Ruby,<br \/>\n- Tworzenie <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/microservices\/\">mikrous\u0142ugi<\/a>.<\/p>\n<p>Maj\u0105c ca\u0142\u0105 wiedz\u0119 z poprzednich pr\u00f3b, postanowili stworzy\u0107 w\u0142asne narz\u0119dzie: <strong>Packwerk<\/strong>.<\/p>\n<h2>Packwerk<\/h2>\n<h3>Czym jest Packwerk?<\/h3>\n<p><strong>Packwerk<\/strong> jest narz\u0119dziem analizy statycznej u\u017cywanym do wymuszania granic mi\u0119dzy grupami <strong>Ruby<\/strong> pliki o nazwie <strong>pakiety<\/strong>.<\/p>\n<h3>Co to jest pakiet?<\/h3>\n<p>A <strong>pakiet<\/strong> to folder zawieraj\u0105cy automatycznie \u0142adowany kod. Shopify's <a href=\"https:\/\/thecodest.co\/pl\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">zesp\u00f3\u0142<\/a> zach\u0119ca do stosowania najlepszych praktyk projektowych podczas tworzenia pakiet\u00f3w.<br \/>\n- Powinni\u015bmy pakowa\u0107 razem rzeczy, kt\u00f3re maj\u0105 wysok\u0105 funkcjonalno\u015b\u0107 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cohesion_(computer_science)\" rel=\"nofollow\">sp\u00f3jno\u015b\u0107<\/a>,<\/p>\n<ul>\n<li>Pakiety powinny by\u0107 ze sob\u0105 stosunkowo lu\u017ano powi\u0105zane.<\/li>\n<\/ul>\n<h3>Rodzaje kontroli granicznych<\/h3>\n<p>Mo\u017cemy egzekwowa\u0107 granice prywatno\u015bci i zale\u017cno\u015bci, sprawdza\u0107 naruszenia granic i zale\u017cno\u015bci cyklicznych.<\/p>\n<h2>Packwerk w praktyce<\/h2>\n<p>Nie ma jednego konkretnego sposobu na ustrukturyzowanie lub zrestrukturyzowanie aplikacji podczas tworzenia pakiet\u00f3w. W tym artykule b\u0119dziemy post\u0119powa\u0107 zgodnie z podej\u015bciem sugerowanym przez<br \/>\nStephan Hagemann w <em>Stopniowa modularyzacja dla Ruby on <a href=\"https:\/\/thecodest.co\/pl\/blog\/ways-to-increase-your-rails-performance\/\">Szyny<\/a><\/em>.<\/p>\n<h3>Wybierz projekt<\/h3>\n<p>Mo\u017cna utworzy\u0107 nowy <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/why-do-projects-fail\/\">projekt<\/a> lub wybra\u0107 jeden ze swoich projekt\u00f3w. Zdecydowa\u0142em si\u0119 u\u017cy\u0107 projektu open-source o nazwie  <a href=\"https:\/\/github.com\/codetriage\/codetriage\" rel=\"nofollow\">CodeTriage<\/a>. Wa\u017cne jest, aby wspomnie\u0107, \u017ce potrzebujemy aplikacji Rails 6, poniewa\u017c <strong>Packwerk<\/strong> u\u017cywa Zeitwerk.<\/p>\n<h3>Inicjalizacja Packwerk<\/h3>\n<p>Najpierw musimy doda\u0107 gem do naszego pliku Gemfile w nast\u0119puj\u0105cy spos\u00f3b <code>gem 'packwerk'<\/code> a nast\u0119pnie uruchomi\u0107 <code>pakiet<\/code>w konsoli. Nast\u0119pnie jeste\u015bmy gotowi do zainicjowania uruchomionego gema <code>packwerk init<\/code>.<\/p>\n<p>Nast\u0119pnie zauwa\u017camy, \u017ce <strong>Packwerk<\/strong> wygenerowa\u0142 trzy pliki dla <a href=\"https:\/\/thecodest.co\/pl\/blog\/why-us-companies-are-opting-for-polish-developers\/\">my<\/a>:<\/p>\n<ul>\n<li>\n<p><em>packwerk.yml<\/em><\/p>\n<\/li>\n<li>\n<p><em>package.yml<\/em><\/p>\n<\/li>\n<li>\n<p><em>inflections.yml<\/em><\/p>\n<\/li>\n<\/ul>\n<p><em>packwerk.yml<\/em> jest plikiem konfiguracyjnym <strong>Packwerk<\/strong> gdzie zdefiniujemy mi\u0119dzy innymi pliki do\u0142\u0105czone i wykluczone, list\u0119 \u015bcie\u017cek \u0142adowania, zdefiniujemy plik fleksji;<\/p>\n<p><em>package.yml<\/em> jest plikiem konfiguracyjnym pakietu. W tym pliku dodamy konfiguracj\u0119 dla granic naszego pakietu. Ka\u017cdy folder z package.yml zostanie rozpoznany jako pakiet przez <strong>Packwerk<\/strong>. To wszystko, <strong>Packwerk<\/strong> stworzy\u0142 nasz pierwszy<br \/>\ni nazywamy go pakietem <em>korze\u0144<\/em> pakiet.<\/p>\n<p><em>inflections.yml<\/em> to miejsce, w kt\u00f3rym umie\u015bcimy nasze niestandardowe fleksje i akronimy na wypadek, gdyby\u015bmy ich u\u017cywali.<\/p>\n<p>Wi\u0119cej informacji na temat plik\u00f3w i ich konfiguracji mo\u017cna znale\u017a\u0107 na stronie<br \/>\n<a href=\"https:\/\/github.com\/Shopify\/packwerk\" rel=\"nofollow\">Packwerk<\/a>.<\/p>\n<h3>W\u0142a\u015bciwo\u015bci Packwerk<\/h3>\n<p>Aby modularyzacja dzia\u0142a\u0142a, potrzebujemy trzech podstawowych w\u0142a\u015bciwo\u015bci: <em>nazwany kontener<\/em>jego <em>zawarto\u015b\u0107<\/em>i wyra\u017anie <em>zale\u017cno\u015bci<\/em> na innych <em>pojemniki<\/em>. Zdefiniujmy wi\u0119c te w\u0142a\u015bciwo\u015bci w <strong>Packwerk<\/strong>:<\/p>\n<ul>\n<li>\n<p><b>Nazwa<\/b>: Nazwa pakietu to jego wzgl\u0119dna \u015bcie\u017cka z katalogu g\u0142\u00f3wnego<br \/>\naplikacja.<\/p>\n<\/li>\n<li>\n<p><b>Tre\u015b\u0107<\/b>: Kiedy umieszczamy package.yml w folderze, wszystkie pliki w folderze s\u0105 teraz zawarto\u015bci\u0105 pakietu.<\/p>\n<\/li>\n<li>\n<p><b>Zale\u017cno\u015bci<\/b>: Mo\u017cemy zdefiniowa\u0107 zale\u017cno\u015bci od innych pakiet\u00f3w dodaj\u0105c klucz zale\u017cno\u015bci do pliku <em>package.yml<\/em>.<\/p>\n<\/li>\n<\/ul>\n<p>Innym plikiem, kt\u00f3ry nie jest do\u0142\u0105czany domy\u015blnie, ale jest zalecany, jest README. Wa\u017cne jest, aby dostarczy\u0107 informacji na temat korzystania z pakietu.<\/p>\n<p>Koniec odcinka I <\/p>\n<p><a href=\"https:\/\/thecodest.co\/contact\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/cta_2.jpeg\" alt=\"Doradztwo w zakresie rozwoju produkt\u00f3w cyfrowych\" \/><\/a><\/p>\n<p><strong>Czytaj wi\u0119cej<\/strong><\/p>\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. Co z wydajno\u015bci\u0105?<\/a><\/p>\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Szyny i inne \u015brodki transportu<\/a><\/p>\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">Rails Development z TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Ludziom trudno jest zobaczy\u0107 szerszy obraz problemu bez po\u015bwi\u0119cania du\u017cej ilo\u015bci czasu i wysi\u0142ku. Dzieje si\u0119 tak zw\u0142aszcza podczas pracy z du\u017cymi i z\u0142o\u017conymi aplikacjami. Jakie s\u0105 skutki uboczne moich zmian? Dlaczego ta linia tutaj wp\u0142ywa na testy odleg\u0142ej cz\u0119\u015bci bazy kodu? Idealne lub kompletne rozwi\u0105zanie nie istnieje, ale Shopify wypu\u015bci\u0142o narz\u0119dzie, kt\u00f3re prawdopodobnie pomo\u017ce Tobie i Twojemu zespo\u0142owi.<\/p>","protected":false},"author":2,"featured_media":3565,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3564","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ruby on Rails modularization with Packwerk Episode I - The Codest<\/title>\n<meta name=\"description\" content=\"Humans find it difficult to see the big picture of a problem without devoting a lot of time and effort. This happens especially while working with large and complex applications. What are the side effects of my changes? Why is this line here affecting the tests of a remote part of the codebase? A perfect or complete solution does not exist, but Shopify came out with a tool that will probably help you and your team.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/pl\/blog\/modularyzacja-ruby-on-rails-z-packwerk-odcinek-i\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby on Rails modularization with Packwerk Episode I\" \/>\n<meta property=\"og:description\" content=\"Humans find it difficult to see the big picture of a problem without devoting a lot of time and effort. This happens especially while working with large and complex applications. What are the side effects of my changes? Why is this line here affecting the tests of a remote part of the codebase? A perfect or complete solution does not exist, but Shopify came out with a tool that will probably help you and your team.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/pl\/blog\/modularyzacja-ruby-on-rails-z-packwerk-odcinek-i\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-05T08:16:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-28T14:05:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Ruby on Rails modularization with Packwerk Episode I\",\"datePublished\":\"2022-01-05T08:16:52+00:00\",\"dateModified\":\"2026-04-28T14:05:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/\"},\"wordCount\":650,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/\",\"name\":\"Ruby on Rails modularization with Packwerk Episode I - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png\",\"datePublished\":\"2022-01-05T08:16:52+00:00\",\"dateModified\":\"2026-04-28T14:05:35+00:00\",\"description\":\"Humans find it difficult to see the big picture of a problem without devoting a lot of time and effort. This happens especially while working with large and complex applications. What are the side effects of my changes? Why is this line here affecting the tests of a remote part of the codebase? A perfect or complete solution does not exist, but Shopify came out with a tool that will probably help you and your team.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-i\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby on Rails modularization with Packwerk Episode I\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/pl\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Modularyzacja Ruby on Rails z Packwerk Epizod I - The Codest","description":"Ludziom trudno jest zobaczy\u0107 szerszy obraz problemu bez po\u015bwi\u0119cania du\u017cej ilo\u015bci czasu i wysi\u0142ku. Dzieje si\u0119 tak zw\u0142aszcza podczas pracy z du\u017cymi i z\u0142o\u017conymi aplikacjami. Jakie s\u0105 skutki uboczne moich zmian? Dlaczego ta linia tutaj wp\u0142ywa na testy odleg\u0142ej cz\u0119\u015bci bazy kodu? Idealne lub kompletne rozwi\u0105zanie nie istnieje, ale Shopify wypu\u015bci\u0142o narz\u0119dzie, kt\u00f3re prawdopodobnie pomo\u017ce Tobie i Twojemu zespo\u0142owi.","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:\/\/thecodest.co\/pl\/blog\/modularyzacja-ruby-on-rails-z-packwerk-odcinek-i\/","og_locale":"pl_PL","og_type":"article","og_title":"Ruby on Rails modularization with Packwerk Episode I","og_description":"Humans find it difficult to see the big picture of a problem without devoting a lot of time and effort. This happens especially while working with large and complex applications. What are the side effects of my changes? Why is this line here affecting the tests of a remote part of the codebase? A perfect or complete solution does not exist, but Shopify came out with a tool that will probably help you and your team.","og_url":"https:\/\/thecodest.co\/pl\/blog\/modularyzacja-ruby-on-rails-z-packwerk-odcinek-i\/","og_site_name":"The Codest","article_published_time":"2022-01-05T08:16:52+00:00","article_modified_time":"2026-04-28T14:05:35+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"4 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Ruby on Rails modularization with Packwerk Episode I","datePublished":"2022-01-05T08:16:52+00:00","dateModified":"2026-04-28T14:05:35+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/"},"wordCount":650,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png","articleSection":["Software Development"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/","url":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/","name":"Modularyzacja Ruby on Rails z Packwerk Epizod I - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png","datePublished":"2022-01-05T08:16:52+00:00","dateModified":"2026-04-28T14:05:35+00:00","description":"Ludziom trudno jest zobaczy\u0107 szerszy obraz problemu bez po\u015bwi\u0119cania du\u017cej ilo\u015bci czasu i wysi\u0142ku. Dzieje si\u0119 tak zw\u0142aszcza podczas pracy z du\u017cymi i z\u0142o\u017conymi aplikacjami. Jakie s\u0105 skutki uboczne moich zmian? Dlaczego ta linia tutaj wp\u0142ywa na testy odleg\u0142ej cz\u0119\u015bci bazy kodu? Idealne lub kompletne rozwi\u0105zanie nie istnieje, ale Shopify wypu\u015bci\u0142o narz\u0119dzie, kt\u00f3re prawdopodobnie pomo\u017ce Tobie i Twojemu zespo\u0142owi.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-_episode_1.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Ruby on Rails modularization with Packwerk Episode I"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"The Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/pl\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/comments?post=3564"}],"version-history":[{"count":5,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3564\/revisions"}],"predecessor-version":[{"id":7982,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3564\/revisions\/7982"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media\/3565"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media?parent=3564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/categories?post=3564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/tags?post=3564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}