{"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-modularisierung-mit-packwerk-episode-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/de\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Ruby on Rails Modularisierung mit Packwerk Episode II"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Bewerbung als Paket<\/h2>\n\n\n\n<p>Der Ansatz zur Modularisierung unserer Anwendung besteht darin, die gesamte Anwendung in ein Paket zu verwandeln.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erstellen Sie die Struktur<\/h3>\n\n\n\n<p>Zun\u00e4chst m\u00fcssen wir Folgendes erstellen <code>app\/packages<\/code> Ordner, in dem wir alle unsere Pakete ablegen werden. Um unsere Pakete zu isolieren, m\u00fcssen wir jedes <strong>MVC-Konzept<\/strong> in einem Ordner. Die \u00dcbernahme der <strong>CodeTriage <a href=\"https:\/\/thecodest.co\/de\/dictionary\/why-do-projects-fail\/\">Projekt<\/a><\/strong> Als Beispiel sehen wir das folgende Bild.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"Paketstruktur \" title=\"Beispiel f\u00fcr eine Paketstruktur\"\/><\/figure>\n\n\n\n<p>Wenn wir versuchen, den Server zu starten, wird er die Konstanten nicht finden. Aus diesem Grund m\u00fcssen wir eine Konfigurationszeile zu unserem <code>anwendung.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>Jetzt funktioniert die Anwendung, aber sie kann die Ansichten nicht finden, also m\u00fcssen wir eine weitere Konfigurationszeile zu unserer <code>application_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\/de\/blog\/ways-to-increase-your-rails-performance\/\">Schiene<\/a>.root.join('app\/packages\/*\/views')))<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erstellen Sie die Pakete<\/h3>\n\n\n\n<p>Unsere Struktur ist fertig, jetzt k\u00f6nnen wir mit der Erstellung der Pakete beginnen. Dazu m\u00fcssen wir nur noch eine<code>paket.yml<\/code> zu jedem Ordner mit der folgenden Konfiguration:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">enforce_privacy: falsch\nenforce_dependencies: true<\/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=\"paket.yml\" title=\"package.yml Beispiel\"\/><\/figure>\n\n\n\n<p><code>datenschutz durchsetzen<\/code>gibt <a href=\"https:\/\/thecodest.co\/de\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> die M\u00f6glichkeit, alle Konstanten des Pakets zu isolieren und mit einem \u00f6ffentlichen <a href=\"https:\/\/thecodest.co\/de\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Um die \u00f6ffentlichen Konstanten freizulegen, m\u00fcssen wir die Konstanten z. B. in&nbsp;<code>packages\/users\/app\/public.<\/code>F\u00fcr den Moment setzen wir diese Konfiguration auf <em> falsch<\/em>.<\/p>\n\n\n\n<p><code>erzwingen_Abh\u00e4ngigkeiten<\/code> erzwingt die Abh\u00e4ngigkeit eines Pakets und pr\u00fcft alle Konstantenreferenzen. Wenn eine Abh\u00e4ngigkeit nicht explizit definiert ist, stellt dies eine Verletzung der Grenze dar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Validierung des Paketsystems<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> ein Kriterium festgelegt, das wir befolgen m\u00fcssen, um ein g\u00fcltiges Paketsystem zu haben. Wir k\u00f6nnen mit der Ausf\u00fchrung von <code>packwerk validieren<\/code> in unserer Konsole.<\/p>\n\n\n\n<p>&nbsp;Dadurch wird unsere Ordnerstruktur \u00fcberpr\u00fcft, <strong>Paketkonfiguration<\/strong>und Autoload Path Cache.<\/p>\n\n\n\n<p>Im Moment ist unsere Anwendung nicht g\u00fcltig und wir m\u00fcssen die Lastpfade in<strong><code>packwerk.yml<\/code>.<\/strong> Dazu m\u00fcssen wir nur die fehlenden Pfade hinzuf\u00fcgen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># packwerk.yml\n\nload_paths:\n.\n.\n.\n\n# Benutzer\n- app\/packages\/benutzer\/steuerungen\n- app\/packages\/benutzer\/models\n- app\/packages\/benutzer\/package.yml\n- app\/packages\/benutzer\/ansichten<\/code><\/pre>\n\n\n\n<p>Jetzt sind wir bereit, Grenzverletzungen in unserer Anwendung zu \u00fcberpr\u00fcfen. Um Verletzungen zu \u00fcberpr\u00fcfen, k\u00f6nnen wir Folgendes ausf\u00fchren<code>packwerk update-deprecations<\/code> wird dieser Befehl Folgendes erzeugen <code>deprecated_references.yml<\/code> Datei f\u00fcr jedes Paket. In jeder Datei finden wir den Paketnamen, die Art des Versto\u00dfes und den Dateipfad. Mit all diesen Informationen wissen wir, wo der Versto\u00df stattfindet, und wir k\u00f6nnen eine Entscheidung treffen, um ihn zu beheben.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/4.png\" alt=\"deprecated_references.yml\" title=\"deprecated_references.yml Beispiel\"\/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># deprecated_references.yml\n\n.\n.\n.\n\napp\/packages\/repos:\n  \"::Repo\":\n    Verst\u00f6\u00dfe:\n    - Abh\u00e4ngigkeit\n    Dateien:\n    - app\/packages\/users\/models\/user.rb<\/code><\/pre>\n\n\n\n<p>Anhand des Beispiels werden wir jeden Teil der erzeugten Informationen beschreiben<br>von <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/packages\/repos<\/code> &nbsp;- Paket, in dem die konstante Verletzung<br>gefunden.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- Pfad zu der Datei, die die verletzte Konstante enth\u00e4lt.<\/p>\n\n\n\n<p>- <code>Abh\u00e4ngigkeiten<\/code> &nbsp;- eine Art der Verletzung, entweder der Abh\u00e4ngigkeit oder der Privatsph\u00e4re.<\/p>\n\n\n\n<p>- <code>app\/packages\/users\/models\/user.rb<\/code> &nbsp;- Pfad zu der Datei, die die verletzte Konstante enth\u00e4lt.<\/p>\n\n\n\n<p>Als letzten Schritt in diesem Abschnitt sollten Sie nicht vergessen, die neu generierten Dateipfade zu <code>packwerk.ym<\/code>l und f\u00fchren Sie die Validierung erneut durch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visualisierung von Abh\u00e4ngigkeiten<\/h3>\n\n\n\n<p>Mit allen Informationen in package.yml und <code>deprecated_references.yml<\/code>k\u00f6nnen wir dann<br>einen Graphen der Abh\u00e4ngigkeiten zu visualisieren. Um dies zu tun, m\u00fcssen wir einen weiteren Edelstein hinzuf\u00fcgen, in diesem Fall werden wir verwenden <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>Laufende Harke <code>pocky:generate<\/code> erzeugen wir eine Datei namens <code>packwerk.png<\/code> wo wir unser erstes Diagramm der Abh\u00e4ngigkeiten visualisieren k\u00f6nnen.<\/p>\n\n\n\n<p>Wenn alle Pakete definiert sind, sieht unser Diagramm wie folgt aus.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"Graph ohne akzeptierte Abh\u00e4ngigkeiten\" title=\"Graph ohne akzeptierte Abh\u00e4ngigkeiten Beispiel\"\/><\/figure>\n\n\n\n<p>Abh\u00e4ngigkeiten existieren bereits, aber das bedeutet nicht, dass sie von <strong>Packwerk<\/strong>. An<br>eine Abh\u00e4ngigkeit zu akzeptieren, m\u00fcssen wir die Konfiguration der Abh\u00e4ngigkeiten in die <code>paket.yml<\/code><br>in jedem Paket. Wir werden uns konzentrieren auf <code>mail_builders<\/code> da es sich um ein Paket ohne zirkul\u00e4re Abh\u00e4ngigkeiten handelt. Es ist erw\u00e4hnenswert, dass <strong>Packwerk<\/strong> l\u00e4sst uns keine zirkul\u00e4ren Abh\u00e4ngigkeiten akzeptieren.<\/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\nenforce_privacy: falsch\nenforce_dependencies: true\nAbh\u00e4ngigkeiten:\n- app\/packages\/docs\n- app\/packages\/issues\n- app\/packages\/repos<\/code><\/pre>\n\n\n\n<p>Nach dem Hinzuf\u00fcgen dieser Konfiguration, <strong>Pocky<\/strong> f\u00e4rbt die akzeptierten Abh\u00e4ngigkeiten gr\u00fcn.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"Graph mit akzeptierten Abh\u00e4ngigkeiten \" title=\"Graph ohne akzeptierte Abh\u00e4ngigkeiten Beispiel\"\/><\/figure>\n\n\n\n<p>Wir k\u00f6nnen l\u00f6schen <code>deprecated_references.yml<\/code> von <code>app\/packages\/mail_builders<\/code> und laufen<br><code>packwerk update-deprecations<\/code> wieder. Die Datei wird nicht erneut erstellt, da alle<br>Verst\u00f6\u00dfe wurden f\u00fcr dieses Paket behoben. Es ist wichtig zu erw\u00e4hnen, dass selbst wenn wir Graph nicht mit akzeptierten Abh\u00e4ngigkeiten<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/de\/blog\/hire-ror-developer\/\">Rubinrot<\/a> on Rails Modularisierung mit Packwerk<\/strong> Abh\u00e4ngigkeiten akzeptieren, funktioniert unsere Anwendung immer noch wie vorher, aber wir haben jetzt mehr<br>Informationen, um Entscheidungen zu treffen und \u00c4nderungen vorzunehmen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beseitigung zirkul\u00e4rer Abh\u00e4ngigkeiten<\/h3>\n\n\n\n<p>In unserem fr\u00fcheren Diagramm gab es eine Menge zirkul\u00e4rer Abh\u00e4ngigkeiten, die irgendwie aufgel\u00f6st werden mussten. Wir haben verschiedene Strategien, um das zu erreichen:<\/p>\n\n\n\n<p>- Nichts tun,<\/p>\n\n\n\n<p>- Abh\u00e4ngigkeiten akzeptieren, Pakete zusammenf\u00fchren,<\/p>\n\n\n\n<p>- Bewegen <a href=\"https:\/\/thecodest.co\/de\/dictionary\/what-is-code-refactoring\/\">Code<\/a> zwischen den Paketen,<\/p>\n\n\n\n<p>- Duplizieren Sie eine Funktionalit\u00e4t,&nbsp;<\/p>\n\n\n\n<p>- Durchf\u00fchrung von Dependency Injection oder Dependency Injection mit Typisierung.<\/p>\n\n\n\n<p>Ein Problem dabei ist, dass wir die Codebasis kennen m\u00fcssen, um eine angemessene Umstrukturierung durchf\u00fchren zu k\u00f6nnen. Ich bin mit der Codebasis dieses Projekts nicht so vertraut, da ich es als Beispiel genommen habe, also werden wir aus praktischen Gr\u00fcnden die erste Strategie w\u00e4hlen, n\u00e4mlich nichts zu tun. Auch wenn wir den gr\u00f6\u00dften Teil des Refactorings vermeiden werden, wollen wir an den Abh\u00e4ngigkeiten in der <em>Wurzel<\/em> Paket.<\/p>\n\n\n\n<p>Das Wurzelpaket enth\u00e4lt den gesamten Klebstoff aus dem <strong>Rails-Framework<\/strong>alle Klassen, von denen wir erben und die alle zusammenarbeiten. Um also die zirkul\u00e4ren Abh\u00e4ngigkeiten zu l\u00f6sen, werden wir in den folgenden Schritten ein neues Paket mit dem Namen rails erstellen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verschieben Sie alle Anwendungsdateien und -ordner von der Anwendung nach <code>app\/packages\/rails<\/code>.<\/li>\n\n\n\n<li>Erstellen einer<code>paket.yml<\/code> f\u00fcr das Paket mit der gleichen Konfiguration wie f\u00fcr die vorherigen Pakete.<\/li>\n\n\n\n<li>F\u00fcgen Sie alle neuen Dateipfade zu <code>packwerk.yml<\/code>.<\/li>\n\n\n\n<li>hinzuf\u00fcgen <code>app\/packages\/rails<\/code> als Abh\u00e4ngigkeit von den \u00fcbrigen Paketen.<\/li>\n<\/ol>\n\n\n\n<p>Sobald wir das Paket erstellt haben, werden wir feststellen, dass es eine Menge Dateien gibt, die umstrukturiert werden k\u00f6nnen. Nachdem wir alles in das entsprechende Paket verschoben und akzeptiert haben<br>Abh\u00e4ngigkeiten haben wir eine neue Struktur und einen saubereren Graphen.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Paketstruktur mit Schienenpaket \" title=\"Paketstruktur mit Schienenpaket Beispiel\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Graph ohne zirkul\u00e4re Wurzelabh\u00e4ngigkeiten\" title=\"Beispiel f\u00fcr einen Graphen ohne zirkul\u00e4re Wurzelabh\u00e4ngigkeiten\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Abh\u00e4ngigkeiten aus dem Wurzelpaket entfernen<\/h3>\n\n\n\n<p>Jetzt sieht unser Graph viel besser aus. Es w\u00e4re toll, wenn wir alle Abh\u00e4ngigkeiten aus dem Wurzelpaket entfernen k\u00f6nnten. Wenn wir die Datei deprecated_references.yml im Wurzelpaket \u00fcberpr\u00fcfen, werden wir feststellen, dass die meisten von ihnen aus <code>Test<\/code> , <code>lib\/Aufgaben<\/code> , <code>db<\/code> und <code>Konfiguration<\/code><br>Ordner. Um diese Abh\u00e4ngigkeiten aufzul\u00f6sen, werden wir in jedem Paket einen Testordner anlegen. Mit etwas wie <code>app\/packages\/users\/test<\/code>. Als n\u00e4chstes werden wir Folgendes ausschlie\u00dfen <code>lib\/Aufgaben<\/code> , <code>db<\/code> und <code>Konfiguration<\/code>neben anderen Ordnern von <strong>Packwerk<\/strong> Analyse, da diese Abh\u00e4ngigkeiten f\u00fcr unsere Analyse nicht wirklich wichtig sind und wir keine einfache M\u00f6glichkeit haben, sie aufzul\u00f6sen. Wir f\u00fcgen Folgendes zu unserer <em>packwerk.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>Nach dem Verschieben aller Tests aus dem Wurzelpaket und dem Ausschluss der Ordner aus der Analyse erhalten wir ein neues Diagramm ohne Wurzelabh\u00e4ngigkeiten.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Graph ohne Wurzelabh\u00e4ngigkeiten\" title=\"Graph ohne Wurzelabh\u00e4ngigkeiten\"\/><\/figure>\n\n\n\n<p>Wie wir sehen k\u00f6nnen, gibt es immer noch zirkul\u00e4re Abh\u00e4ngigkeiten in<code>Benutzer<\/code> , <code>Repos<\/code> und <code>docs<\/code> . Wir haben sie zwar nicht gel\u00f6st, aber wir haben jetzt wichtige Informationen zu \u00fcbermitteln. Wir wissen, dass jeder <a href=\"https:\/\/thecodest.co\/de\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">Team<\/a> das \u00c4nderungen an einem dieser Pakete vornimmt, muss wahrscheinlich auch \u00c4nderungen an den Paketen mit der zirkul\u00e4ren Abh\u00e4ngigkeit vornehmen. Andererseits wissen wir, dass ein Team an folgenden Dingen arbeiten kann <code>github_fetchers<\/code> nur, zu wissen, welche Pakete es gibt<br>in jedem Moment von den Ver\u00e4nderungen betroffen zu sein.<\/p>\n\n\n\n<p>Das Endergebnis des Projekts finden Sie unter <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">hier<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">N\u00e4chster Schritt<\/h3>\n\n\n\n<p>Als n\u00e4chsten Schritt k\u00f6nnten Sie in jedem Paket eine konstante Privatsph\u00e4re erzwingen und nur die \u00f6ffentliche API offenlegen, die f\u00fcr andere Pakete zug\u00e4nglich ist. Sie k\u00f6nnen einfach konfigurieren, wo Ihre API in <em>paket.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">enforce_privacy: wahr\nenforce_dependencies: true\npublic_path: my\/custom\/path\/<\/code><\/pre>\n\n\n\n<p><code> <\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schlussfolgerungen<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> gibt uns viele Informationen \u00fcber unsere Anwendung und mit diesen Informationen k\u00f6nnen wir Entscheidungen treffen, um den Arbeitsablauf unserer Teams zu verbessern. Obwohl der Prozess langwierig und mit vielen Konfigurationen verbunden zu sein schien, muss das nicht immer so sein. Wir k\u00f6nnen damit beginnen, Pakete nur f\u00fcr den neuen Code zu erstellen, der zu unserer Anwendung hinzugef\u00fcgt wird, und dann schrittweise modularisieren. Jetzt k\u00f6nnen wir anfangen, \u00fcber schrittweise Modularisierung zu sprechen. Dieses Konzept wurde von Stephan Hagemann eingef\u00fchrt. <em>\"Wir k\u00f6nnen zum ersten Mal beschlie\u00dfen, einen Teil des Codes auf ehrgeizige Weise zu modularisieren... Dies erm\u00f6glicht uns, ein schrittweise wachsendes Unterst\u00fctzungssystem f\u00fcr eine bessere Anwendungsstruktur zu schaffen\".<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Schrittweise Modularisierung f\u00fcr Ruby on Rails - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Erzwingen von Modularit\u00e4t in Rails-Anwendungen mit 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\">Quellcode des Artikels<\/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=\"Beratung zur digitalen Produktentwicklung\"\/><\/a><\/figure>\n\n\n\n<p><strong>Mehr lesen<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. Wie sieht es mit der Leistung aus?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Eisenbahnen und andere Transportmittel<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">Rails-Entwicklung mit TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>In der zweiten Folge unserer Ruby on Rails-Modularisierung mit Packwerk werden wir das Konzept der Anwendung als Paket unter die Lupe nehmen.<\/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=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/de\/blog\/ruby-on-rails-modularisierung-mit-packwerk-episode-ii\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/blog\/ruby-on-rails-modularisierung-mit-packwerk-episode-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\u00a0Minuten\" \/>\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\":\"de\",\"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\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@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\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@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\":\"de\",\"@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\\\/de\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ruby on Rails Modularisierung mit Packwerk Episode II - The Codest","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\/de\/blog\/ruby-on-rails-modularisierung-mit-packwerk-episode-ii\/","og_locale":"de_DE","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\/de\/blog\/ruby-on-rails-modularisierung-mit-packwerk-episode-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\u00a0Minuten"},"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":"de","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 Modularisierung mit 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","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"de","@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":"Der 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":"de"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"Der Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"de","@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":"de","@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\/de\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/de\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}