{"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":"modularizzazione-di-ruby-on-rails-con-packwerk-episodio-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/it\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Ruby on Rails modulare con Packwerk Episode II"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Applicazione come pacchetto<\/h2>\n\n\n\n<p>L'approccio per modularizzare la nostra applicazione consiste nel convertire l'intera applicazione in un pacchetto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creare la struttura<\/h3>\n\n\n\n<p>Per prima cosa, \u00e8 necessario creare <code>app\/pacchetti<\/code> in cui verranno inseriti tutti i nostri pacchetti. Per isolare i nostri pacchetti, dobbiamo separare tutti i pacchetti da <strong>Concetto MVC<\/strong> in una cartella. Prendendo il <strong>CodiceTriage <a href=\"https:\/\/thecodest.co\/it\/dictionary\/why-do-projects-fail\/\">progetto<\/a><\/strong> come esempio avremo qualcosa di simile alla seguente immagine.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"struttura del pacchetto \" title=\"esempio di struttura del pacchetto\"\/><\/figure>\n\n\n\n<p>Se proviamo a eseguire il server, non riuscir\u00e0 a trovare le costanti. Ecco perch\u00e9 dobbiamo aggiungere una riga di configurazione al nostro file <code>applicazione.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>Ora l'applicazione funziona, ma non riesce a trovare le viste, quindi dobbiamo aggiungere un'altra riga di configurazione al nostro file <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\/it\/blog\/ways-to-increase-your-rails-performance\/\">Rotaie<\/a>.root.join('app\/packages\/*\/views'))<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creare i pacchetti<\/h3>\n\n\n\n<p>La nostra struttura \u00e8 pronta, quindi ora possiamo iniziare a creare i pacchetti. Per farlo, dobbiamo solo aggiungere un elemento<code>pacchetto.yml<\/code> in ogni cartella con la seguente configurazione:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">enforce_privacy: false\napplica_dipendenze: 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=\"pacchetto.yml\" title=\"esempio di package.yml\"\/><\/figure>\n\n\n\n<p><code>applicare_privacy<\/code>d\u00e0 <a href=\"https:\/\/thecodest.co\/it\/blog\/why-us-companies-are-opting-for-polish-developers\/\">noi<\/a> la possibilit\u00e0 di isolare tutte le costanti del pacchetto e di lavorare con un pacchetto pubblico. <a href=\"https:\/\/thecodest.co\/it\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Per esporre le costanti pubbliche, occorre aggiungere le costanti, ad esempio, in&nbsp;<code>packages\/users\/app\/public.<\/code>Per ora impostiamo questa configurazione a <em> falso<\/em>.<\/p>\n\n\n\n<p><code>applicare_dipendenze<\/code> imporr\u00e0 la dipendenza di un pacchetto e controller\u00e0 tutti i riferimenti alle costanti. Se una dipendenza non \u00e8 definita esplicitamente, sar\u00e0 una violazione del limite.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convalida del sistema di pacchetti<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> ha stabilito un criterio da seguire per avere un sistema di pacchetti valido. Possiamo iniziare a eseguire <code>packwerk convalidare<\/code> nella nostra console.<\/p>\n\n\n\n<p>&nbsp;In questo modo si controller\u00e0 la struttura delle cartelle, <strong>configurazione del pacchetto<\/strong>e la cache dei percorsi con caricamento automatico.<\/p>\n\n\n\n<p>In questo momento, la nostra applicazione non \u00e8 valida e dobbiamo correggere i percorsi di caricamento in<strong><code>packwerk.yml<\/code>.<\/strong> A tal fine, \u00e8 sufficiente aggiungere i percorsi mancanti.<\/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# Utenti\n- app\/packages\/utenti\/controllori\n- app\/pacchetti\/utenti\/modelli\n- app\/packages\/users\/package.yml\n- app\/packages\/users\/views<\/code><\/pre>\n\n\n\n<p>A questo punto, siamo pronti a verificare le violazioni dei limiti nella nostra applicazione. Per verificare le violazioni, possiamo eseguire<code>packwerk aggiornamento-deprecazioni<\/code> , questo comando generer\u00e0 <code>riferimenti_deprecati.yml<\/code> per ogni pacchetto. In ogni file si trovano il nome del pacchetto, il tipo di violazione e il percorso del file. Con tutte queste informazioni sappiamo dove si verifica la violazione e possiamo prendere una decisione per risolverla.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/4.png\" alt=\"riferimenti_deprecati.yml\" title=\"Esempio di deprecated_references.yml\"\/><\/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    violazioni:\n    - dipendenza\n    file:\n    - app\/packages\/users\/models\/user.rb<\/code><\/pre>\n\n\n\n<p>Riprendendo l'esempio, descriveremo ogni parte dell'informazione generata<br>da <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/pacchetti\/repos<\/code> &nbsp;- dove la violazione della costante \u00e8<br>trovato.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- percorso del file contenente la costante violata.<\/p>\n\n\n\n<p>- <code>dipendenza<\/code> &nbsp;- un tipo di violazione, sia della dipendenza che della privacy.<\/p>\n\n\n\n<p>- <code>app\/packages\/users\/models\/user.rb<\/code> &nbsp;- percorso del file contenente la costante violata.<\/p>\n\n\n\n<p>Come ultimo passo di questa sezione, non dimenticate di aggiungere i nuovi percorsi dei file generati a <code>packwerk.ym<\/code>l ed eseguire nuovamente le convalide.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visualizzazione delle dipendenze<\/h3>\n\n\n\n<p>Con tutte le informazioni contenute nel file package.yml e nel file <code>riferimenti_deprecati.yml<\/code>possiamo quindi<br>visualizzare un grafico delle dipendenze. Per farlo, dobbiamo aggiungere un'altra gemma, in questo caso useremo <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>Rastrello in corsa <code>pocky:generare<\/code> genereremo un file chiamato <code>packwerk.png<\/code> dove possiamo visualizzare il nostro primo grafico delle dipendenze.<\/p>\n\n\n\n<p>Con tutti i pacchetti definiti, il nostro grafico avr\u00e0 questo aspetto.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"grafo senza dipendenze accettate\" title=\"esempio di grafo senza dipendenze accettate\"\/><\/figure>\n\n\n\n<p>Le dipendenze esistono gi\u00e0, ma non significa che siano accettate da <strong>Packwerk<\/strong>. A<br>accettare una dipendenza, dobbiamo aggiungere la configurazione delle dipendenze al file <code>pacchetto.yml<\/code><br>in ogni pacchetto. Ci concentreremo su <code>costruttori_di_posta<\/code> poich\u00e9 si tratta di un pacchetto senza dipendenza circolare. Vale la pena ricordare che <strong>Packwerk<\/strong> non ci permette di accettare dipendenze circolari.<\/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: false\nenforce_dependencies: true\ndipendenze:\n- app\/pacchetti\/docs\n- app\/pacchetti\/problemi\n- app\/pacchetti\/repos<\/code><\/pre>\n\n\n\n<p>Dopo aver aggiunto questa configurazione, <strong>Pocky<\/strong> colorer\u00e0 di verde le dipendenze accettate.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"con le dipendenze accettate \" title=\"esempio di grafo senza dipendenze accettate\"\/><\/figure>\n\n\n\n<p>Possiamo eliminare <code>riferimenti_deprecati.yml<\/code> da <code>app\/packages\/mail_builders<\/code> ed eseguire<br><code>packwerk aggiornamento-deprecazioni<\/code> di nuovo. Il file non verr\u00e0 generato di nuovo, poich\u00e9 tutti i file<br>sono state corrette per questo pacchetto. \u00c8 importante menzionare che, anche se non si tratta di Grafico con dipendenze accettate<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/it\/blog\/hire-ror-developer\/\">Rubino<\/a> sulla modularizzazione di Rails con Packwerk<\/strong> accettare le dipendenze la nostra applicazione continuer\u00e0 a funzionare come prima, ma ora abbiamo pi\u00f9<br>informazioni per prendere decisioni e rifattorizzare.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rimuovere le dipendenze circolari<\/h3>\n\n\n\n<p>Nel nostro grafico precedente, avevamo molte dipendenze circolari che dovevano essere risolte in qualche modo. Abbiamo diverse strategie per farlo:<\/p>\n\n\n\n<p>- Non fare nulla,<\/p>\n\n\n\n<p>- Accettare le dipendenze, unire i pacchetti,<\/p>\n\n\n\n<p>- Muoversi <a href=\"https:\/\/thecodest.co\/it\/dictionary\/what-is-code-refactoring\/\">codice<\/a> tra i pacchetti,<\/p>\n\n\n\n<p>- Duplicare una funzionalit\u00e0,&nbsp;<\/p>\n\n\n\n<p>- Eseguire l'iniezione di dipendenza o l'iniezione di dipendenza con tipizzazione.<\/p>\n\n\n\n<p>Un problema \u00e8 che per fare un refactor corretto, dobbiamo conoscere la base di codice. Non ho molta familiarit\u00e0 con la base di codice di questo progetto, dato che l'ho preso come esempio, quindi per ragioni pratiche sceglieremo la prima strategia, non fare nulla. Anche se eviteremo la maggior parte delle operazioni di refactoring, vogliamo lavorare sulle dipendenze nel <em>radice<\/em> pacchetto.<\/p>\n\n\n\n<p>Il pacchetto radice contiene tutto il collante del pacchetto <strong>Struttura Rails<\/strong>Tutte le classi da cui ereditiamo e che facciamo funzionare insieme. Quindi, per risolvere il problema delle dipendenze circolari, creeremo un nuovo pacchetto chiamato rails nei seguenti passi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Spostare tutti i file e le cartelle dell'applicazione dall'app a <code>app\/pacchetti\/rails<\/code>.<\/li>\n\n\n\n<li>Creare un<code>pacchetto.yml<\/code> per il pacchetto con la stessa configurazione dei pacchetti precedenti.<\/li>\n\n\n\n<li>Aggiungete tutti i nuovi percorsi dei file a <code>packwerk.yml<\/code>.<\/li>\n\n\n\n<li>Aggiungi <code>app\/pacchetti\/rails<\/code> come dipendenza dal resto dei pacchetti.<\/li>\n<\/ol>\n\n\n\n<p>Una volta creato il pacchetto, inizieremo a notare molti file che possono essere ristrutturati. Dopo aver spostato tutto nel pacchetto corrispondente e dopo aver accettato<br>dipendenze, avremo una nuova struttura e un grafo pi\u00f9 pulito.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Struttura del pacchetto con pacchetto di binari \" title=\"Struttura del pacchetto con esempio di pacchetto rails\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Grafico senza dipendenze circolari dalla radice\" title=\"Esempio di grafico senza dipendenze circolari dalla radice\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Rimuovere le dipendenze dal pacchetto principale<\/h3>\n\n\n\n<p>Ora il nostro grafico ha un aspetto migliore, sarebbe bello se potessimo rimuovere tutte le dipendenze dal pacchetto principale. Se controlliamo deprecated_references.yml nel pacchetto radice, noteremo che la maggior parte di esse proviene da <code>test<\/code> , <code>lib\/tasks<\/code> , <code>db<\/code> e <code>configurazione<\/code><br>cartella. Per risolvere queste dipendenze, creeremo una cartella di test all'interno di ogni pacchetto. Avendo qualcosa come <code>app\/pacchetti\/utenti\/test<\/code>. Successivamente, escluderemo <code>lib\/tasks<\/code> , <code>db<\/code> e <code>configurazione<\/code>tra le altre cartelle di <strong>Packwerk<\/strong> poich\u00e9 queste dipendenze non sono importanti per la nostra analisi e non abbiamo un modo semplice per risolverle. Aggiungeremo quanto segue al nostro file <em>packwerk.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">escludere:\n- \"{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}\/**\/*\"\n- \"lib\/tasks\/**\/*.rake\"<\/code><\/pre>\n\n\n\n<p>Dopo aver spostato tutti i test dal pacchetto root ed escluso le cartelle dall'analisi, avremo un nuovo grafico senza le dipendenze da root.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Grafico senza dipendenze dalle radici\" title=\"Grafico senza dipendenze dalle radici\"\/><\/figure>\n\n\n\n<p>Come possiamo vedere, abbiamo ancora dipendenze circolari in<code>utenti<\/code> , <code>repos<\/code> , e <code>documenti<\/code> . Anche se non li abbiamo risolti, ora abbiamo informazioni importanti da trasmettere. Sappiamo che ogni <a href=\"https:\/\/thecodest.co\/it\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">squadra<\/a> che esegue modifiche in uno di questi pacchetti dovr\u00e0 probabilmente eseguire modifiche nei pacchetti con la dipendenza circolare. D'altra parte, sappiamo che un team pu\u00f2 lavorare su <code>github_fetchers<\/code> esclusivamente, sapendo quali sono i pacchetti<br>che si fa influenzare dai cambiamenti in ogni momento.<\/p>\n\n\n\n<p>Potete trovare il risultato finale del progetto <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">qui<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Passo successivo<\/h3>\n\n\n\n<p>Come passo successivo, si potrebbe imporre una privacy costante in ogni pacchetto ed esporre solo l'API pubblica che sar\u00e0 accessibile da altri pacchetti. Si pu\u00f2 facilmente configurare la posizione dell'API in <em>pacchetto.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">enforce_privacy: true\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\">Conclusioni<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> ci fornisce molte informazioni sulla nostra applicazione e con queste informazioni possiamo prendere decisioni per migliorare il flusso di lavoro dei nostri team. Anche se il processo sembra essere lungo e con molte configurazioni, non deve essere sempre cos\u00ec. Possiamo iniziare a creare pacchetti solo per il nuovo codice aggiunto alla nostra applicazione e poi modulare gradualmente. Ora possiamo iniziare a parlare di modularizzazione graduale, un concetto introdotto da Stephan Hagemann. <em>\"Possiamo, per la prima volta, decidere di iniziare a modularizzare una porzione di codice in modo aspirazionale... Questo ci permette di creare un sistema di supporto in graduale espansione verso una migliore struttura dell'applicazione\".<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fonti<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Modularizzazione graduale per Ruby on Rails - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Applicare la modularit\u00e0 alle applicazioni Rails con 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\">Codice sorgente dell'articolo<\/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=\"Consulenza per lo sviluppo di prodotti digitali\"\/><\/a><\/figure>\n\n\n\n<p><strong>Per saperne di pi\u00f9<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. E le prestazioni?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Rotaie e altri mezzi di trasporto<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">Sviluppo di Rails con TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Nella seconda puntata della nostra modularizzazione dell'Ruby on Rails con Packwerk esamineremo da vicino il concetto di applicazione come pacchetto.<\/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\/it\/blog\/modularizzazione-di-ruby-on-rails-con-packwerk-episodio-ii\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/blog\/modularizzazione-di-ruby-on-rails-con-packwerk-episodio-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 minuti\" \/>\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\":\"it-IT\",\"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\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@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\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@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\":\"it-IT\",\"@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\\\/it\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ruby on Rails modulare con Packwerk Episodio II - The Codest","description":"Nella seconda puntata della nostra modularizzazione dell'Ruby on Rails con Packwerk esamineremo da vicino il concetto di applicazione come pacchetto.","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\/it\/blog\/modularizzazione-di-ruby-on-rails-con-packwerk-episodio-ii\/","og_locale":"it_IT","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\/it\/blog\/modularizzazione-di-ruby-on-rails-con-packwerk-episodio-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 minuti"},"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":"it-IT","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 modulare con Packwerk Episodio 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":"Nella seconda puntata della nostra modularizzazione dell'Ruby on Rails con Packwerk esamineremo da vicino il concetto di applicazione come pacchetto.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@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":"it-IT"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@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":"it-IT","@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\/it\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}