{"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-modulariseerimine-packwerkiga-episood-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/et\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Ruby on Rails modulariseerimine Packwerk Episode II abil"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Taotlus kui pakett<\/h2>\n\n\n\n<p>Meie rakenduse moduleerimine seisneb selles, et kogu rakendus muudetakse paketiks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Loo struktuur<\/h3>\n\n\n\n<p>K\u00f5igepealt peame looma <code>app\/packages<\/code> kausta, kuhu me paigutame k\u00f5ik oma paketid. Selleks, et meie pakette eraldada, peame eraldama iga paketi <strong>MVC kontseptsioon<\/strong> \u00fches kaustas. V\u00f5ttes <strong>CodeTriage <a href=\"https:\/\/thecodest.co\/et\/dictionary\/why-do-projects-fail\/\">projekt<\/a><\/strong> n\u00e4iteks on meil midagi sellist nagu j\u00e4rgmine pilt.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"paketi struktuur \" title=\"paketi struktuuri n\u00e4ide\"\/><\/figure>\n\n\n\n<p>Kui me \u00fcritame serverit k\u00e4ivitada, ei leia see konstante. Seet\u00f5ttu peame lisama rea konfiguratsiooni meie <code>application.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>N\u00fc\u00fcd t\u00f6\u00f6tab rakendus, kuid ei leia vaateid, seega peame lisama veel \u00fche rea konfiguratsiooni meie <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\/et\/blog\/ways-to-increase-your-rails-performance\/\">R\u00f6\u00f6pad<\/a>.root.join('app\/packages\/*\/views')))<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Luua paketid<\/h3>\n\n\n\n<p>Meie struktuur on valmis, nii et n\u00fc\u00fcd saame alustada pakettide loomist. Selleks peame ainult lisama<code>package.yml<\/code> igasse kausta j\u00e4rgmise konfiguratsiooniga:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">enforce_privacy: false\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=\"package.yml\" title=\"package.yml n\u00e4ide\"\/><\/figure>\n\n\n\n<p><code>enforce_privacy<\/code>annab <a href=\"https:\/\/thecodest.co\/et\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> v\u00f5imalus isoleerida k\u00f5ik paketi konstandid ja t\u00f6\u00f6tada avaliku <a href=\"https:\/\/thecodest.co\/et\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Selleks, et avalikustada avalikud konstandid, peame lisama konstandid n\u00e4iteks j\u00e4rgmiselt&nbsp;<code>packages\/users\/app\/public.<\/code>Hetkel seame selle konfiguratsiooni v\u00e4\u00e4rtuseks <em> vale<\/em>.<\/p>\n\n\n\n<p><code>enforce_dependencies<\/code> kontrollib paketi s\u00f5ltuvust ja kontrollib k\u00f5iki konstandiviiteid. Kui s\u00f5ltuvus ei ole selges\u00f5naliselt m\u00e4\u00e4ratletud, siis on see piiride rikkumine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pakendis\u00fcsteemi valideerimine<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> kehtestas kriteeriumi, mida peame j\u00e4rgima, et meil oleks kehtiv paketis\u00fcsteem. Me v\u00f5ime hakata k\u00e4ivitama <code>packwerk valideerib<\/code> meie konsoolis.<\/p>\n\n\n\n<p>&nbsp;See kontrollib meie kaustade struktuuri, <strong>paketi konfiguratsioon<\/strong>, ja autoload path cache.<\/p>\n\n\n\n<p>Praegu ei kehti meie rakendus ja me peame parandama koormusrajad aastal<strong><code>packwerk.yml<\/code>.<\/strong> Selleks tuleb meil lisada vaid puuduolevad teed.<\/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# Kasutajad\n- app\/packages\/users\/controllers\n- app\/packages\/users\/models\n- app\/packages\/users\/package.yml\n- app\/packages\/users\/views<\/code><\/pre>\n\n\n\n<p>Siinkohal oleme valmis kontrollima piiride rikkumisi meie rakenduses. Rikkumiste kontrollimiseks v\u00f5ime k\u00e4ivitada<code>packwerk update-deprecations<\/code> , see k\u00e4sk genereerib <code>deprecated_references.yml<\/code> faili iga paketi jaoks. Igast failist leiame paketi nime, rikkumise t\u00fc\u00fcbi ja faili tee. Kogu selle teabe p\u00f5hjal teame, kus rikkumine toimub, ja saame teha otsuse selle lahendamiseks.<\/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 n\u00e4ide\"\/><\/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    :\n    - dependentsus\n    failid:\n    - app\/packages\/users\/models\/user.rb<\/code><\/pre>\n\n\n\n<p>V\u00f5ttes n\u00e4ite, kirjeldame iga osa genereeritud teabest<br>poolt <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/packages\/repos<\/code> &nbsp;- pakett, kus konstantne rikkumine on<br>leitud.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- tee faili, mis sisaldab rikutud konstanti.<\/p>\n\n\n\n<p>- <code>s\u00f5ltuvus<\/code> &nbsp;- mingi rikkumine, kas s\u00f5ltuvus v\u00f5i eraelu puutumatus.<\/p>\n\n\n\n<p>- <code>app\/packages\/users\/models\/user.rb<\/code> &nbsp;- tee faili, mis sisaldab rikutud konstanti.<\/p>\n\n\n\n<p>Viimase sammuna selles jaotises \u00e4rge unustage lisada uued genereeritud failipolud aadressile <code>packwerk.ym<\/code>l ja k\u00e4ivitage valideerimine uuesti.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">S\u00f5ltuvuse visualiseerimine<\/h3>\n\n\n\n<p>K\u00f5ik andmed package.yml ja <code>deprecated_references.yml<\/code>saame siis<br>visualiseerida s\u00f5ltuvuste graafikut. Selleks peame lisama veel \u00fche p\u00e4rli, sel juhul kasutame me <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>Jooksvad hargad <code>pocky:generate<\/code> genereerime faili nimega <code>packwerk.png<\/code> kus me saame visualiseerida oma esimest s\u00f5ltuvuste graafikut.<\/p>\n\n\n\n<p>Kui k\u00f5ik paketid on m\u00e4\u00e4ratletud, n\u00e4eb meie graafik v\u00e4lja selline.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"graafik ilma aktsepteeritud s\u00f5ltuvusteta\" title=\"graaf ilma aktsepteeritud s\u00f5ltuvusteta n\u00e4ide\"\/><\/figure>\n\n\n\n<p>s\u00f5ltuvused on juba olemas, kuid see ei t\u00e4henda, et neid aktsepteerib <strong>Packwerk<\/strong>. Et<br>aktsepteerida s\u00f5ltuvust peame lisama s\u00f5ltuvuste konfiguratsioonile <code>package.yml<\/code><br>igas pakendis. Me keskendume <code>mail_builders<\/code> kuna tegemist on paketiga, millel ei ole \u00fcmmargust s\u00f5ltuvust. Tasub mainida, et <strong>Packwerk<\/strong> ei lase meil aktsepteerida ringikujulisi s\u00f5ltuvusi.<\/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\ndependencies:\n- app\/packages\/docs\n- app\/packages\/issues\n- app\/packages\/repos<\/code><\/pre>\n\n\n\n<p>P\u00e4rast selle konfiguratsiooni lisamist, <strong>Pocky<\/strong> v\u00e4rvib aktsepteeritud s\u00f5ltuvused roheliseks.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"graafik koos aktsepteeritud s\u00f5ltuvustega \" title=\"graaf ilma aktsepteeritud s\u00f5ltuvusteta n\u00e4ide\"\/><\/figure>\n\n\n\n<p>Me v\u00f5ime kustutada <code>deprecated_references.yml<\/code> aadressilt <code>app\/packages\/mail_builders<\/code> ja k\u00e4ivitada<br><code>packwerk update-deprecations<\/code> uuesti. Faili ei genereerita uuesti, kuna k\u00f5ik<br>selle paketi puhul parandati rikkumised. Oluline on mainida, et isegi kui me ei graafi aktsepteeritud s\u00f5ltuvustega<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/et\/blog\/hire-ror-developer\/\">Ruby<\/a> Railsi modulariseerimine Packwerkiga<\/strong> aktsepteerida s\u00f5ltuvusi, t\u00f6\u00f6tab meie rakendus endiselt nagu varem, kuid n\u00fc\u00fcd on meil rohkem<br>teavet otsuste tegemiseks ja \u00fcmbert\u00f6\u00f6tlemiseks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eemaldage ringikujulised s\u00f5ltuvused<\/h3>\n\n\n\n<p>Meie eelmises graafikus oli palju ringikujulisi s\u00f5ltuvusi, mis tuli kuidagi lahendada. Meil on selleks erinevaid strateegiaid:<\/p>\n\n\n\n<p>- \u00c4rge tehke midagi,<\/p>\n\n\n\n<p>- V\u00f5tke s\u00f5ltuvused vastu, \u00fchendage pakette,<\/p>\n\n\n\n<p>- Liikumine <a href=\"https:\/\/thecodest.co\/et\/dictionary\/what-is-code-refactoring\/\">kood<\/a> pakettide vahel,<\/p>\n\n\n\n<p>- Funktsionaalsuse dubleerimine,&nbsp;<\/p>\n\n\n\n<p>- Tehke s\u00f5ltuvuse s\u00fcstimine v\u00f5i s\u00f5ltuvuse s\u00fcstimine koos t\u00fc\u00fcbistamisega.<\/p>\n\n\n\n<p>\u00dcks probleem on see, et korraliku refaktooringu tegemiseks peame tundma koodibaasi. Ma ei ole selle projekti koodibaasiga nii h\u00e4sti kursis, kuna v\u00f5tsin selle n\u00e4itena, seega praktilistel p\u00f5hjustel l\u00e4heme esimese strateegiaga, ei tee midagi. Isegi kui me v\u00e4ldime enamiku refaktooringutest, tahame t\u00f6\u00f6tada s\u00f5ltuvuste osas <em>juur<\/em> pakett.<\/p>\n\n\n\n<p>Juurpakett sisaldab k\u00f5iki liimi alates <strong>Rails raamistik<\/strong>, k\u00f5ik klassid, millest me p\u00e4rime, ja paneme k\u00f5ik koos t\u00f6\u00f6le. Seega, selleks, et lahendada \u00fcmmargused s\u00f5ltuvused, loome j\u00e4rgmise sammu raames uue paketi nimega rails:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Liigutage k\u00f5ik rakenduse_ failid ja kaustad rakendusest aadressile <code>app\/packages\/rails<\/code>.<\/li>\n\n\n\n<li>Loo<code>package.yml<\/code> paketi jaoks, mille konfiguratsioon on sama, mis eelmistel pakettidel.<\/li>\n\n\n\n<li>Lisage k\u00f5ik uued failipolud aadressile <code>packwerk.yml<\/code>.<\/li>\n\n\n\n<li>Lisa <code>app\/packages\/rails<\/code> s\u00f5ltuvusena \u00fclej\u00e4\u00e4nud pakettidest.<\/li>\n<\/ol>\n\n\n\n<p>Kui me loome paketi, hakkame m\u00e4rkama palju faile, mida saab \u00fcmber struktureerida. P\u00e4rast seda, kui k\u00f5ik on viidud vastavasse paketti ja aktsepteeritud<br>s\u00f5ltuvused on meil uus struktuur ja puhtam graaf.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Paketi struktuur koos r\u00f6\u00f6baspaketiga \" title=\"Paketi struktuur koos r\u00f6\u00f6baspaketi n\u00e4itega\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Graafik ilma juurest tulenevate \u00fcmmarguste s\u00f5ltuvusteta\" title=\"Graafik ilma juurest tulenevate \u00fcmmarguste s\u00f5ltuvusteta n\u00e4ide\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Eemaldage s\u00f5ltuvused juurpaketi peapaketist<\/h3>\n\n\n\n<p>N\u00fc\u00fcd meie graafik n\u00e4eb palju parem v\u00e4lja oleks hea, kui me saame eemaldada k\u00f5ik s\u00f5ltuvused juurpakett. Kui me vaatame deprecated_references.yml faili root paketis, siis m\u00e4rkame, et enamik neist on p\u00e4rit <code>test<\/code> , <code>lib\/tasks<\/code> , <code>db<\/code> ja <code>config<\/code><br>kaust. Nende s\u00f5ltuvuste lahendamiseks loome iga paketi sees testkausta. V\u00f5ttes midagi sellist nagu <code>app\/packages\/users\/test<\/code>. J\u00e4rgmisena j\u00e4tame v\u00e4lja <code>lib\/tasks<\/code> , <code>db<\/code> ja <code>config<\/code>teiste kaustade hulgas <strong>Packwerk<\/strong> anal\u00fc\u00fcsi, kuna need s\u00f5ltuvused ei ole meie anal\u00fc\u00fcsis tegelikult olulised ja meil ei ole lihtsat viisi nende lahendamiseks. Me lisame oma <em>packwerk.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">v\u00e4listada:\n- \"{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}\/**\/*\"\n- \"lib\/tasks\/**\/*.rake\"<\/code><\/pre>\n\n\n\n<p>P\u00e4rast k\u00f5igi testide teisaldamist juurpaketi alt ja kaustade v\u00e4ljaj\u00e4tmist anal\u00fc\u00fcsist saame uue graafiku ilma juurs\u00f5ltuvusteta.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Graafik ilma juurs\u00f5ltuvusteta\" title=\"Graafik ilma juurs\u00f5ltuvusteta\"\/><\/figure>\n\n\n\n<p>Nagu n\u00e4eme, on meil ikka veel ringikujulisi s\u00f5ltuvusi<code>kasutajad<\/code> , <code>repos<\/code> ja <code>docs<\/code> . Kuigi me ei lahendanud neid, on meil n\u00fc\u00fcd oluline teave, mida edasi anda. Me teame, et iga <a href=\"https:\/\/thecodest.co\/et\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">meeskond<\/a> mis teeb muudatusi \u00fches neist pakettidest, peab t\u00f5en\u00e4oliselt tegema muudatusi ka pakettides, mille puhul on tegemist ringikujulise s\u00f5ltuvusega. Teisest k\u00fcljest teame, et meeskond v\u00f5ib t\u00f6\u00f6tada <code>github_fetchers<\/code> ainult, teades, millised paketid on<br>muutustega igal hetkel m\u00f5jutatud saada.<\/p>\n\n\n\n<p>Projekti l\u00f5pptulemuse leiad <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">siin<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">J\u00e4rgmine samm<\/h3>\n\n\n\n<p>J\u00e4rgmise sammuna v\u00f5iksite igas paketis kehtestada pideva privaatsuse ja avalikustada ainult avaliku API, mis on teistest pakettidest k\u00e4ttesaadav. Saate h\u00f5lpsasti konfigureerida, kuhu teie API paigutatakse <em>package.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\">J\u00e4reldused<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> annab meile palju teavet meie rakenduse kohta ja selle teabe abil saame teha otsuseid, et parandada meie meeskondade t\u00f6\u00f6voogu. Kuigi protsess tundus pikk ja paljude seadistustega, ei pea see alati nii olema. Me v\u00f5ime alustada pakettide loomist ainult meie rakendusse lisatud uue koodi jaoks ja seej\u00e4rel j\u00e4rk-j\u00e4rgult moduleerida. Nii et n\u00fc\u00fcd v\u00f5ime hakata r\u00e4\u00e4kima j\u00e4rkj\u00e4rgulisest modulatsioonist see on Stephan Hagemanni poolt tutvustatud kontseptsioon <em>\"Me saame esimest korda otsustada, et me hakkame osa koodist p\u00fc\u00fcdlikult moduleerima... See v\u00f5imaldab meil luua j\u00e4rk-j\u00e4rgult laieneva tugis\u00fcsteemi parema rakendusstruktuuri suunas\".<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Allikad<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Ruby on Rails j\u00e4rkj\u00e4rguline modulariseerimine - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Modulaarsuse j\u00f5ustamine Rails rakendustes koos Packwerkiga<\/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\">Artikli l\u00e4htekood<\/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=\"Digitaalse tootearenduse n\u00f5ustamine\"\/><\/a><\/figure>\n\n\n\n<p><strong>Loe edasi<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. Kuidas on tulemuslikkus?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">R\u00f6\u00f6pad ja muud transpordivahendid<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">Railsi arendamine TMUX, Vim, Fzf + Ripgrep abil<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Meie Ruby on Rails modulariseerimise teises episoodis koos Packwerkiga vaatleme l\u00e4hemalt rakenduse kui paketi m\u00f5istet.<\/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\/et\/blogi\/ruby-on-rails-modulariseerimine-packwerkiga-episood-ii\/\" \/>\n<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/blogi\/ruby-on-rails-modulariseerimine-packwerkiga-episood-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 minutit\" \/>\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\":\"et\",\"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\":\"et\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"et\",\"@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\":\"et\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"et\",\"@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\":\"et\",\"@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\\\/et\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ruby on Rails moduleerimine koos Packwerk Episode II-ga - 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\/et\/blogi\/ruby-on-rails-modulariseerimine-packwerkiga-episood-ii\/","og_locale":"et_EE","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\/et\/blogi\/ruby-on-rails-modulariseerimine-packwerkiga-episood-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 minutit"},"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":"et","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 moduleerimine koos Packwerk Episode II-ga - 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":"et","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"et","@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":"et"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"et","@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":"et","@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\/et\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}