{"id":3566,"date":"2022-01-10T15:47:14","date_gmt":"2022-01-10T15:47:14","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"},"modified":"2026-04-28T14:05:25","modified_gmt":"2026-04-28T14:05:25","slug":"ruby-on-rails-modularisatie-met-packwerk-aflevering-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/nl\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Ruby on Rails modularisatie met Packwerk Episode II"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Toepassing als pakket<\/h2>\n\n\n\n<p>De aanpak om onze applicatie te modulariseren bestaat uit het omzetten van de hele applicatie in een pakket.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cre\u00eber de structuur<\/h3>\n\n\n\n<p>Eerst moeten we <code>app\/pakketten<\/code> map waar we al onze pakketten zullen plaatsen. Om onze pakketten te isoleren moeten we elke <strong>MVC-concept<\/strong> in \u00e9\u00e9n map. De <strong>CodeTriage <a href=\"https:\/\/thecodest.co\/nl\/dictionary\/why-do-projects-fail\/\">project<\/a><\/strong> Als voorbeeld hebben we zoiets als de volgende afbeelding.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"pakketstructuur \" title=\"voorbeeld pakketstructuur\"\/><\/figure>\n\n\n\n<p>Als we de server proberen te starten, zal hij de constanten niet vinden. Daarom moeten we een configuratieregel toevoegen aan onze <code>toepassing.rb<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">config.paths.add 'app\/packages', glob: '*\/{*,*\/concerns}', eager_load:true<\/code><\/pre>\n\n\n\n<p>Nu werkt de applicatie maar kan de weergaven niet vinden, dus moeten we nog een configuratieregel toevoegen aan onze <code>toepassing_controller.rb<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">append_view_path(Dir.glob(<a href=\"https:\/\/thecodest.co\/nl\/blog\/ways-to-increase-your-rails-performance\/\">Rails<\/a>.root.join('app\/packages\/*\/views'))<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">De pakketten maken<\/h3>\n\n\n\n<p>Onze structuur is klaar, dus nu kunnen we beginnen met het maken van de pakketten. Om dat te doen, hoeven we alleen maar een<code>package.yml<\/code> naar elke map met de volgende configuratie:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">privacy afdwingen: false\nafhankelijkheden afdwingen: waar<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/1.png\" alt=\"package.yml\" title=\"package.yml voorbeeld\"\/><\/figure>\n\n\n\n<p><code>privacy afdwingen<\/code>geeft <a href=\"https:\/\/thecodest.co\/nl\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> de mogelijkheid om alle constanten van het pakket te isoleren en te werken met een publieke <a href=\"https:\/\/thecodest.co\/nl\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Om de publieke constanten bloot te leggen, moeten we de constanten toevoegen in bijvoorbeeld&nbsp;<code>pakketten\/gebruikers\/app\/public.<\/code>Voor nu gaan we deze configuratie instellen op <em> vals<\/em>.<\/p>\n\n\n\n<p><code>afhankelijkheden afdwingen<\/code> zal de afhankelijkheid van een pakket afdwingen en controleren op alle constante verwijzingen. Als een afhankelijkheid niet expliciet is gedefinieerd, is dit een schending van de grens.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Het pakketsysteem valideren<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> een criterium vastgesteld dat we moeten volgen om een geldig pakketsysteem te hebben. We kunnen beginnen met het uitvoeren van <code>pakwerk geldig<\/code> in onze console.<\/p>\n\n\n\n<p>&nbsp;Hiermee wordt onze mappenstructuur gecontroleerd, <strong>pakketconfiguratie<\/strong>en autoload padcache.<\/p>\n\n\n\n<p>Op dit moment is onze applicatie niet geldig en moeten we de laadpaden in<strong><code>pakwerk.yml<\/code>.<\/strong> Om dit te doen, hoeven we alleen de ontbrekende paden toe te voegen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># pakwerk.yml\n\nlaadpaden:\n.\n.\n.\n\n# Gebruikers\n- app\/pakketten\/gebruikers\/controllers\n- app\/pakketten\/gebruikers\/modellen\n- app\/pakketten\/gebruikers\/pakket.yml\n- app\/pakketten\/gebruikers\/weergaven<\/code><\/pre>\n\n\n\n<p>Op dit punt zijn we klaar om grensschendingen in onze applicatie te controleren. Om schendingen te controleren kunnen we het volgende uitvoeren<code>packwerk update-deprecations<\/code> zal dit commando het volgende genereren <code>verouderde_verwijzingen.yml<\/code> bestand voor elk pakket. In elk bestand vinden we de pakketnaam, het type overtreding en het bestandspad. Met al deze informatie weten we waar de schending plaatsvindt en kunnen we een beslissing nemen om de schending op te lossen.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/4.png\" alt=\"verouderde_verwijzingen.yml\" title=\"afgeschreven_verwijzingen.yml voorbeeld\"\/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># verouderde_verwijzingen.yml\n\n.\n.\n.\n\napp\/pakketten\/repos:\n  \"::Repo\":\n    schendingen:\n    - afhankelijkheid\n    bestanden:\n    - app\/packages\/users\/models\/user.rb<\/code><\/pre>\n\n\n\n<p>Aan de hand van het voorbeeld gaan we elk deel van de gegenereerde informatie beschrijven<br>door <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/pakketten\/repos<\/code> &nbsp;- pakket waar de constante schending is<br>gevonden.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- pad naar het bestand met de geschonden constante.<\/p>\n\n\n\n<p>- <code>afhankelijkheid<\/code> &nbsp;- een type schending, afhankelijkheid of privacy.<\/p>\n\n\n\n<p>- <code>app\/pakketten\/gebruikers\/modellen\/gebruiker.rb<\/code> &nbsp;- pad naar het bestand met de geschonden constante.<\/p>\n\n\n\n<p>Vergeet als laatste stap in dit onderdeel niet om de nieuwe gegenereerde bestandspaden toe te voegen aan <code>pakwerk.ym<\/code>l en voer de validaties opnieuw uit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visualisatie van afhankelijkheid<\/h3>\n\n\n\n<p>Met alle informatie in package.yml en <code>verouderde_verwijzingen.yml<\/code>dan kunnen we<br>een grafiek van afhankelijkheden visualiseren. Om dat te doen moeten we nog een gem toevoegen, in dit geval gebruiken we <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>Lopende hark <code>pocky:genereren<\/code> genereren we een bestand met de naam <code>pakwerk.png<\/code> waar we onze eerste grafiek van afhankelijkheden kunnen visualiseren.<\/p>\n\n\n\n<p>Met alle pakketten gedefinieerd ziet onze grafiek er als volgt uit.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"grafiek zonder geaccepteerde afhankelijkheden\" title=\"grafiek zonder geaccepteerde afhankelijkheden voorbeeld\"\/><\/figure>\n\n\n\n<p>afhankelijkheden bestaan al, maar dat betekent niet dat ze worden geaccepteerd door <strong>Packwerk<\/strong>. Naar<br>een afhankelijkheid accepteren, moeten we de afhankelijkhedenconfiguratie toevoegen aan de <code>package.yml<\/code><br>in elk pakket. We richten ons op <code>mail_bouwers<\/code> omdat het een pakket is zonder circulaire afhankelijkheid. Het is het vermelden waard dat <strong>Packwerk<\/strong> laat ons geen circulaire afhankelijkheden accepteren.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># app\/packages\/mail_builders\/package.yml\n\n``ruby\nprivacy afdwingen: false\nafhankelijkheden afdwingen: true\nafhankelijkheden:\n- app\/pakketten\/docs\n- app\/pakketten\/problemen\n- app\/pakketten\/repos<\/code><\/pre>\n\n\n\n<p>Na het toevoegen van deze configuratie, <strong>Pocky<\/strong> zal de geaccepteerde afhankelijkheden groen kleuren.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"grafiek met geaccepteerde afhankelijkheden \" title=\"grafiek zonder geaccepteerde afhankelijkheden voorbeeld\"\/><\/figure>\n\n\n\n<p>We kunnen verwijderen <code>verouderde_verwijzingen.yml<\/code> van <code>app\/pakketten\/mail_bouwers<\/code> en ren<br><code>packwerk update-deprecations<\/code> opnieuw. Het bestand wordt niet opnieuw gegenereerd omdat alle<br>schendingen werden opgelost voor dit pakket. Het is belangrijk om te vermelden dat zelfs als we niet Graph met geaccepteerde afhankelijkheden<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/nl\/blog\/hire-ror-developer\/\">Ruby<\/a> modularisatie op Rails met Packwerk<\/strong> afhankelijkheden accepteren zal onze applicatie nog steeds werken zoals voorheen, maar nu hebben we meer<br>informatie om beslissingen te nemen en te refactoren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Circulaire afhankelijkheden verwijderen<\/h3>\n\n\n\n<p>In onze vorige grafiek hadden we veel circulaire afhankelijkheden die op de een of andere manier moesten worden opgelost. We hebben verschillende strategie\u00ebn om dat te doen:<\/p>\n\n\n\n<p>- Niets doen,<\/p>\n\n\n\n<p>- Afhankelijkheden accepteren, pakketten samenvoegen,<\/p>\n\n\n\n<p>- Verplaatsen <a href=\"https:\/\/thecodest.co\/nl\/dictionary\/what-is-code-refactoring\/\">code<\/a> tussen pakketten,<\/p>\n\n\n\n<p>- Een functionaliteit dupliceren,&nbsp;<\/p>\n\n\n\n<p>- Voer afhankelijkheidsinjectie of afhankelijkheidsinjectie met typing uit.<\/p>\n\n\n\n<p>Een probleem hierbij is dat om een goede refactor uit te voeren, we de codebase moeten kennen. Ik ben niet zo bekend met de codebase van dit project omdat ik het als voorbeeld heb genomen, dus om praktische redenen gaan we voor de eerste strategie, niets doen. Zelfs als we het grootste deel van het refactoren vermijden, willen we werken aan de afhankelijkheden in de <em>wortel<\/em> pakket.<\/p>\n\n\n\n<p>Het rootpakket bevat alle lijm van de <strong>Rails raamwerk<\/strong>Alle klassen waar we van erven en laten samenwerken. Dus, om de circulaire afhankelijkheden op te lossen, gaan we een nieuw pakket maken met de naam rails in de volgende stappen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verplaats alle applicatie_ bestanden en mappen van de app naar <code>app\/pakketten\/rails<\/code>.<\/li>\n\n\n\n<li>Maak een<code>package.yml<\/code> voor het pakket met dezelfde configuratie als de vorige pakketten.<\/li>\n\n\n\n<li>Voeg alle nieuwe bestandspaden toe aan <code>pakwerk.yml<\/code>.<\/li>\n\n\n\n<li>Voeg  toe <code>app\/pakketten\/rails<\/code> als een afhankelijkheid van de rest van de pakketten.<\/li>\n<\/ol>\n\n\n\n<p>Zodra we het pakket hebben gemaakt, zullen we veel bestanden opmerken die opnieuw kunnen worden gestructureerd. Nadat we alles naar het overeenkomstige pakket hebben verplaatst en het<br>afhankelijkheden hebben we een nieuwe structuur en een schonere grafiek.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Pakketstructuur met rails \" title=\"Pakketstructuur met rails pakketvoorbeeld\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Grafiek zonder circulaire afhankelijkheden\" title=\"Grafiek zonder root circulaire afhankelijkheden voorbeeld\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Afhankelijkheden van het hoofdpakket verwijderen<\/h3>\n\n\n\n<p>Nu ziet onze grafiek er veel beter uit. Het zou geweldig zijn als we alle afhankelijkheden van het rootpakket kunnen verwijderen. Als we deprecated_references.yml in het rootpakket controleren, zullen we zien dat de meeste van hen van <code>test<\/code> , <code>lib\/taken<\/code> , <code>db<\/code> en <code>config<\/code><br>map. Om deze afhankelijkheden op te lossen, gaan we in elk pakket een testmap maken. Iets als <code>app\/pakketten\/gebruikers\/test<\/code>. Vervolgens gaan we <code>lib\/taken<\/code> , <code>db<\/code> en <code>config<\/code>onder andere mappen van <strong>Packwerk<\/strong> analyse omdat die afhankelijkheden niet echt belangrijk zijn in onze analyse en we geen gemakkelijke manier hebben om ze op te lossen. We voegen het volgende toe aan onze <em>pakwerk.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">exclude:\n- \"{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}\/**\/*\"\n- \"lib\/tasks\/**\/*.rake\"<\/code><\/pre>\n\n\n\n<p>Na het verplaatsen van alle tests uit het rootpakket en het uitsluiten van de mappen uit de analyse, hebben we een nieuwe grafiek zonder rootafhankelijkheden.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Grafiek zonder wortelafhankelijkheden\" title=\"Grafiek zonder wortelafhankelijkheden\"\/><\/figure>\n\n\n\n<p>Zoals we kunnen zien, hebben we nog steeds circulaire afhankelijkheden in<code>gebruikers<\/code> , <code>repo's<\/code> en <code>docs<\/code> . Hoewel we ze niet hebben opgelost, hebben we nu belangrijke informatie om door te geven. We weten dat elke <a href=\"https:\/\/thecodest.co\/nl\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">team<\/a> die wijzigingen doorvoert in \u00e9\u00e9n van die pakketten, zal waarschijnlijk ook wijzigingen moeten doorvoeren in de pakketten met de circulaire afhankelijkheid. Aan de andere kant weten we dat een team kan werken aan <code>github_fetchers<\/code> alleen, weten welke pakketten<br>die op elk moment wordt be\u00efnvloed door de veranderingen.<\/p>\n\n\n\n<p>Je kunt het eindresultaat van het project vinden <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">hier<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Volgende stap<\/h3>\n\n\n\n<p>Als volgende stap zou je constante privacy kunnen afdwingen in elk pakket en alleen de openbare API kunnen vrijgeven die toegankelijk zal zijn vanuit andere pakketten. Je kunt eenvoudig configureren waar je API wordt geplaatst in <em>package.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">privacy afdwingen: true\nafhankelijkheden afdwingen: waar\nopenbaar_pad: mijn\/aangepast\/pad\/<\/code><\/pre>\n\n\n\n<p><code> <\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusies<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> geeft ons veel informatie over onze applicatie en met die informatie kunnen we beslissingen nemen om de workflow van onze teams te verbeteren. Hoewel het proces lang leek en met veel configuraties, hoeft het niet altijd zo te zijn. We kunnen beginnen met het maken van pakketten alleen voor de nieuwe code die aan onze applicatie wordt toegevoegd en dan geleidelijk modulariseren. Nu kunnen we dus beginnen te praten over geleidelijke modularisatie, een concept dat is ge\u00efntroduceerd door Stephan Hagemann. <em>\"We kunnen voor het eerst besluiten om te beginnen met het modulariseren van een deel van de code op een aspirationele manier... Dit stelt ons in staat om een geleidelijk uitbreidend ondersteuningssysteem te cre\u00ebren in de richting van een betere applicatiestructuur\".<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bronnen<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Geleidelijke modularisatie voor Ruby on Rails - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Modulariteit afdwingen in Rails-apps met Packwerk<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/Shopify\/packwerk\">Packwerk Github<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\">Broncode van het artikel<\/a><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/thecodest.co\/contact\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/cta_2.jpeg\" alt=\"Advies over digitale productontwikkeling\"\/><\/a><\/figure>\n\n\n\n<p><strong>Meer lezen<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. Hoe zit het met de prestaties?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Rails en andere transportmiddelen<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">Rails ontwikkelen met TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>In de tweede aflevering van onze Ruby on Rails modularisatie met Packwerk nemen we het concept van applicatie als pakket onder de loep.<\/p>","protected":false},"author":2,"featured_media":3567,"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-3566","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 II - The Codest<\/title>\n<meta name=\"description\" content=\"In the second episode of our Ruby on Rails modularization with Packwerk we will take a close look at the concept of application as an package.\" \/>\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\/nl\/blog\/ruby-on-rails-modularisatie-met-packwerk-aflevering-ii\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby on Rails modularization with Packwerk Episode II\" \/>\n<meta property=\"og:description\" content=\"In the second episode of our Ruby on Rails modularization with Packwerk we will take a close look at the concept of application as an package.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/nl\/blog\/ruby-on-rails-modularisatie-met-packwerk-aflevering-ii\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-10T15:47:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-28T14:05:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.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=\"8 minuten\" \/>\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-ii\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Ruby on Rails modularization with Packwerk Episode II\",\"datePublished\":\"2022-01-10T15:47:14+00:00\",\"dateModified\":\"2026-04-28T14:05:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"},\"wordCount\":1295,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\",\"name\":\"Ruby on Rails modularization with Packwerk Episode II - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png\",\"datePublished\":\"2022-01-10T15:47:14+00:00\",\"dateModified\":\"2026-04-28T14:05:25+00:00\",\"description\":\"In the second episode of our Ruby on Rails modularization with Packwerk we will take a close look at the concept of application as an package.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby on Rails modularization with Packwerk Episode II\"}]},{\"@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\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@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\":\"nl-NL\",\"@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\\\/nl\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ruby on Rails modularisatie met Packwerk Episode II - The Codest","description":"In de tweede aflevering van onze Ruby on Rails modularisatie met Packwerk nemen we het concept van applicatie als pakket onder de loep.","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\/nl\/blog\/ruby-on-rails-modularisatie-met-packwerk-aflevering-ii\/","og_locale":"nl_NL","og_type":"article","og_title":"Ruby on Rails modularization with Packwerk Episode II","og_description":"In the second episode of our Ruby on Rails modularization with Packwerk we will take a close look at the concept of application as an package.","og_url":"https:\/\/thecodest.co\/nl\/blog\/ruby-on-rails-modularisatie-met-packwerk-aflevering-ii\/","og_site_name":"The Codest","article_published_time":"2022-01-10T15:47:14+00:00","article_modified_time":"2026-04-28T14:05:25+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"8 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Ruby on Rails modularization with Packwerk Episode II","datePublished":"2022-01-10T15:47:14+00:00","dateModified":"2026-04-28T14:05:25+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"},"wordCount":1295,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png","articleSection":["Software Development"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","url":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","name":"Ruby on Rails modularisatie met Packwerk Episode II - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png","datePublished":"2022-01-10T15:47:14+00:00","dateModified":"2026-04-28T14:05:25+00:00","description":"In de tweede aflevering van onze Ruby on Rails modularisatie met Packwerk nemen we het concept van applicatie als pakket onder de loep.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Ruby on Rails modularization with Packwerk Episode II"}]},{"@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":"nl-NL"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@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":"nl-NL","@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\/nl\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}