{"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":"modularizacion-de-ruby-on-rails-con-packwerk-episodio-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/es\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Modularizaci\u00f3n Ruby on Rails con Packwerk Episodio II"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Aplicaci\u00f3n como paquete<\/h2>\n\n\n\n<p>El enfoque para modularizar nuestra aplicaci\u00f3n consiste en convertir toda la aplicaci\u00f3n en un paquete.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Crear la estructura<\/h3>\n\n\n\n<p>En primer lugar, debemos crear <code>app\/paquetes<\/code> donde colocaremos todos nuestros paquetes. Para aislar nuestros paquetes tenemos que separar cada <strong>Concepto MVC<\/strong> en una carpeta. Tomando la <strong>CodeTriage <a href=\"https:\/\/thecodest.co\/es\/dictionary\/why-do-projects-fail\/\">proyecto<\/a><\/strong> como ejemplo tendremos algo como la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"estructura del paquete \" title=\"ejemplo de estructura de un paquete\"\/><\/figure>\n\n\n\n<p>Si intentamos ejecutar el servidor, no encontrar\u00e1 las constantes. Es por eso que tenemos que a\u00f1adir una l\u00ednea de configuraci\u00f3n a nuestra <code>application.rb<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">config.paths.add 'app\/paquetes', glob: '*\/{*,*\/preocupaciones}', eager_load:true<\/code><\/pre>\n\n\n\n<p>Ahora la aplicaci\u00f3n funciona, pero no puede encontrar las vistas, por lo que tenemos que a\u00f1adir otra l\u00ednea de configuraci\u00f3n a nuestro <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\/es\/blog\/ways-to-increase-your-rails-performance\/\">Rieles<\/a>.root.join('app\/paquetes\/*\/vistas')))<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Crear los paquetes<\/h3>\n\n\n\n<p>Nuestra estructura est\u00e1 lista, as\u00ed que ahora podemos empezar a crear los paquetes. Para ello, s\u00f3lo tenemos que a\u00f1adir un<code>paquete.yml<\/code> a cada carpeta con la siguiente configuraci\u00f3n:<\/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=\"paquete.yml\" title=\"package.yml ejemplo\"\/><\/figure>\n\n\n\n<p><code>reforzar_la_privacidad<\/code>da <a href=\"https:\/\/thecodest.co\/es\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> la posibilidad de aislar todas las constantes del paquete y trabajar con un p\u00fablico <a href=\"https:\/\/thecodest.co\/es\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Para exponer las constantes p\u00fablicas, necesitamos a\u00f1adir las constantes en, por ejemplo&nbsp;<code>packages\/users\/app\/public.<\/code>Por ahora vamos a establecer esta configuraci\u00f3n en <em> falso<\/em>.<\/p>\n\n\n\n<p><code>aplicar_dependencias<\/code> impondr\u00e1 la dependencia de un paquete y comprobar\u00e1 todas las referencias constantes. Si una dependencia no est\u00e1 definida expl\u00edcitamente ser\u00e1 una violaci\u00f3n del l\u00edmite.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Validaci\u00f3n del sistema de paquetes<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> estableci\u00f3 un criterio que debemos seguir para tener un sistema de paquetes v\u00e1lido. Podemos empezar a ejecutar <code>packwerk validate<\/code> en nuestra consola.<\/p>\n\n\n\n<p>&nbsp;Esto comprobar\u00e1 nuestra estructura de carpetas, <strong>configuraci\u00f3n del paquete<\/strong>y autocargar la cach\u00e9 de rutas.<\/p>\n\n\n\n<p>Ahora mismo, nuestra aplicaci\u00f3n no es v\u00e1lida y tenemos que arreglar las rutas de carga en<strong><code>packwerk.yml<\/code>.<\/strong> Para ello, s\u00f3lo tenemos que a\u00f1adir las rutas que faltan.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># packwerk.yml\n\nrutas_carga:\n.\n.\n.\n\n# Usuarios\n- app\/paquetes\/usuarios\/controladores\n- app\/paquetes\/usuarios\/modelos\n- app\/paquetes\/usuarios\/paquete.yml\n- app\/paquetes\/usuarios\/vistas<\/code><\/pre>\n\n\n\n<p>En este punto, estamos listos para comprobar las violaciones de los l\u00edmites en nuestra aplicaci\u00f3n. Para comprobar las violaciones podemos ejecutar<code>packwerk update-deprecations<\/code> este comando generar\u00e1 <code>deprecated_references.yml<\/code> para cada paquete. En cada archivo encontraremos el nombre del paquete, el tipo de violaci\u00f3n y la ruta del archivo. Con toda esta informaci\u00f3n sabemos d\u00f3nde se est\u00e1 produciendo la infracci\u00f3n y podemos tomar una decisi\u00f3n para resolverla.<\/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 ejemplo\"\/><\/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\/paquetes\/repos:\n  \"::Repo\":\n    :\n    - dependencia\n    files:\n    - app\/paquetes\/usuarios\/modelos\/usuario.rb<\/code><\/pre>\n\n\n\n<p>Tomando el ejemplo vamos a describir cada parte de la informaci\u00f3n generada<br>por <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/paquetes\/repos<\/code> &nbsp;- donde la violaci\u00f3n constante es<br>encontrado.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- ruta al archivo que contiene la constante violada.<\/p>\n\n\n\n<p>- <code>dependencia<\/code> &nbsp;- un tipo de violaci\u00f3n, ya sea de la dependencia o de la intimidad.<\/p>\n\n\n\n<p>- <code>app\/paquetes\/usuarios\/modelos\/usuario.rb<\/code> &nbsp;- ruta al archivo que contiene la constante violada.<\/p>\n\n\n\n<p>Como paso final de esta secci\u00f3n, no olvide a\u00f1adir las nuevas rutas de archivo generadas a <code>packwerk.ym<\/code>l y vuelva a ejecutar las validaciones.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visualizaci\u00f3n de la dependencia<\/h3>\n\n\n\n<p>Con toda la informaci\u00f3n en package.yml y <code>deprecated_references.yml<\/code>podemos entonces<br>visualizar un gr\u00e1fico de dependencias. Para ello necesitamos a\u00f1adir otra gema, en este caso usaremos <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>Rastrillo <code>pocky:generar<\/code> generaremos un archivo llamado <code>packwerk.png<\/code> donde podemos visualizar nuestro primer gr\u00e1fico de dependencias.<\/p>\n\n\n\n<p>Con todos los paquetes definidos nuestro gr\u00e1fico tendr\u00e1 este aspecto.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"gr\u00e1fico sin dependencias aceptadas\" title=\"ejemplo de gr\u00e1fico sin dependencias aceptadas\"\/><\/figure>\n\n\n\n<p>dependencias ya existen, pero eso no significa que sean aceptadas por <strong>Packwerk<\/strong>. A<br>aceptar una dependencia tenemos que a\u00f1adir la configuraci\u00f3n de dependencias al archivo <code>paquete.yml<\/code><br>en cada paquete. Nos centraremos en <code>mail_builders<\/code> ya que es un paquete sin dependencia circular. Cabe mencionar que <strong>Packwerk<\/strong> no nos permitir\u00e1 aceptar dependencias circulares.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\"># app\/paquetes\/mail_builders\/paquete.yml\n\n```ruby\nenforce_privacy: false\nenforce_dependencies: true\ndependencias:\n- app\/paquetes\/docs\n- app\/paquetes\/temas\n- app\/paquetes\/repositorios<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s de a\u00f1adir esta configuraci\u00f3n, <strong>Pocky<\/strong> colorear\u00e1 en verde las dependencias aceptadas.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"gr\u00e1fico con dependencias aceptadas \" title=\"ejemplo de gr\u00e1fico sin dependencias aceptadas\"\/><\/figure>\n\n\n\n<p>Podemos eliminar <code>deprecated_references.yml<\/code> de <code>app\/paquetes\/mail_builders<\/code> y ejecuta<br><code>packwerk update-deprecations<\/code> de nuevo. El archivo no se generar\u00e1 de nuevo ya que todos los<br>para este paquete. Es importante mencionar que aunque no Graph con dependencias aceptadas<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/es\/blog\/hire-ror-developer\/\">Ruby<\/a> modularizaci\u00f3n on Rails con Packwerk<\/strong> aceptar dependencias nuestra aplicaci\u00f3n seguir\u00e1 funcionando como antes, pero ahora tenemos m\u00e1s<br>informaci\u00f3n para tomar decisiones y refactorizar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eliminar las dependencias circulares<\/h3>\n\n\n\n<p>En nuestro gr\u00e1fico anterior, ten\u00edamos muchas dependencias circulares que hab\u00eda que resolver de alguna manera. Tenemos diferentes estrategias para hacerlo:<\/p>\n\n\n\n<p>- No hacer nada,<\/p>\n\n\n\n<p>- Aceptar dependencias, Fusionar paquetes,<\/p>\n\n\n\n<p>- Desplazamiento <a href=\"https:\/\/thecodest.co\/es\/dictionary\/what-is-code-refactoring\/\">c\u00f3digo<\/a> entre paquetes,<\/p>\n\n\n\n<p>- Duplicar una funcionalidad,&nbsp;<\/p>\n\n\n\n<p>- Realizar inyecci\u00f3n de dependencias o inyecci\u00f3n de dependencias con tipado.<\/p>\n\n\n\n<p>Una cuesti\u00f3n aqu\u00ed es que para hacer una refactorizaci\u00f3n adecuada, necesitamos conocer el c\u00f3digo base. No estoy muy familiarizado con la base de c\u00f3digo de este proyecto, ya que lo tom\u00e9 como ejemplo, as\u00ed que por razones pr\u00e1cticas vamos a ir con la primera estrategia, no hacer nada. Incluso si vamos a evitar la mayor parte de la refactorizaci\u00f3n, queremos trabajar en las dependencias en el <em>ra\u00edz<\/em> paquete.<\/p>\n\n\n\n<p>El paquete ra\u00edz contiene toda la cola del <strong>Marco Rails<\/strong>, todas las clases de las que heredamos y hacemos que funcionen todas juntas. Por lo tanto, con el fin de resolver las dependencias circulares, vamos a crear un nuevo paquete llamado rieles dentro de los siguientes pasos:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Mueve todos los archivos y carpetas de la aplicaci\u00f3n_ a <code>app\/paquetes\/rails<\/code>.<\/li>\n\n\n\n<li>Crear un<code>paquete.yml<\/code> para el paquete con la misma configuraci\u00f3n que los paquetes anteriores.<\/li>\n\n\n\n<li>A\u00f1ade todas las nuevas rutas de archivos a <code>packwerk.yml<\/code>.<\/li>\n\n\n\n<li>A\u00f1adir <code>app\/paquetes\/rails<\/code> como dependencia del resto de paquetes.<\/li>\n<\/ol>\n\n\n\n<p>Una vez creado el paquete empezaremos a notar una gran cantidad de archivos que pueden ser reestructurados. Despu\u00e9s de mover todo al paquete correspondiente y aceptar<br>dependencias tendremos una nueva estructura y un gr\u00e1fico m\u00e1s limpio.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Estructura de paquetes con paquete de ra\u00edles \" title=\"Ejemplo de estructura de paquetes con rails\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Gr\u00e1fico sin dependencias circulares ra\u00edz\" title=\"Ejemplo de gr\u00e1fico sin dependencias circulares ra\u00edz\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Eliminar dependencias del paquete ra\u00edz<\/h3>\n\n\n\n<p>Ahora nuestro gr\u00e1fico se ve mucho mejor, ser\u00eda genial si pudi\u00e9ramos eliminar todas las dependencias del paquete ra\u00edz. Si comprobamos deprecated_references.yml en el paquete ra\u00edz, nos daremos cuenta de que la mayor\u00eda de ellas son de <code>prueba<\/code> , <code>lib\/tareas<\/code> , <code>db<\/code> y <code>config<\/code><br>carpeta. Para resolver estas dependencias, vamos a crear una carpeta de prueba dentro de cada paquete. Tener algo como <code>app\/paquetes\/usuarios\/prueba<\/code>. A continuaci\u00f3n, vamos a excluir <code>lib\/tareas<\/code> , <code>db<\/code> y <code>config<\/code>entre otras carpetas de <strong>Packwerk<\/strong> ya que esas dependencias no son realmente importantes en nuestro an\u00e1lisis y no tenemos una forma f\u00e1cil de resolverlas. A\u00f1adiremos lo siguiente a nuestro <em>packwerk.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">excluir:\n- \"{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}\/**\/*\"\n- \"lib\/tasks\/**\/*.rake\"<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s de mover todas las pruebas del paquete ra\u00edz y excluir las carpetas del an\u00e1lisis tendremos un nuevo gr\u00e1fico sin dependencias ra\u00edz.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Gr\u00e1fico sin dependencias ra\u00edz\" title=\"Gr\u00e1fico sin dependencias ra\u00edz\"\/><\/figure>\n\n\n\n<p>Como vemos, seguimos teniendo dependencias circulares en<code>usuarios<\/code> , <code>repos<\/code> y <code>docs<\/code> . Aunque no los resolvimos, ahora tenemos informaci\u00f3n importante que transmitir. Sabemos que cada <a href=\"https:\/\/thecodest.co\/es\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">equipo<\/a> que realice cambios en uno de esos paquetes probablemente tendr\u00e1 que realizar cambios en los paquetes con la dependencia circular. Por otro lado, sabemos que un equipo puede trabajar en <code>github_fetchers<\/code> \u00fanicamente, saber qu\u00e9 paquetes son<br>vi\u00e9ndose afectado por los cambios de cada momento.<\/p>\n\n\n\n<p>Puede consultar el resultado final del proyecto <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Siguiente paso<\/h3>\n\n\n\n<p>Como siguiente paso, podr\u00edas imponer una privacidad constante en cada paquete y exponer s\u00f3lo la API p\u00fablica que ser\u00e1 accesible desde otros paquetes. Puedes configurar f\u00e1cilmente d\u00f3nde se colocar\u00e1 tu API en <em>paquete.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: mi\/ruta\/personalizada\/<\/code><\/pre>\n\n\n\n<p><code> <\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> nos da mucha informaci\u00f3n sobre nuestra aplicaci\u00f3n y con esa informaci\u00f3n podemos tomar decisiones para mejorar el flujo de trabajo de nuestros equipos. Aunque el proceso parec\u00eda largo y con muchas configuraciones, no tiene por qu\u00e9 ser as\u00ed siempre. Podemos empezar creando paquetes s\u00f3lo para el nuevo c\u00f3digo que se a\u00f1ada a nuestra aplicaci\u00f3n y luego modularizar poco a poco. As\u00ed que ahora podemos empezar a hablar de Modularizaci\u00f3n Gradual este es el concepto introducido por Stephan Hagemann <em>\"Podemos, por primera vez, decidir empezar a modularizar una parte del c\u00f3digo de forma aspiracional... Esto nos permite crear un sistema de apoyo que se ampl\u00eda gradualmente hacia una mejor estructura de la aplicaci\u00f3n\".<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fuentes<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Modularizaci\u00f3n gradual para Ruby on Rails - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Modularidad en aplicaciones 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\">C\u00f3digo fuente del art\u00edculo<\/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=\"Consultor\u00eda de desarrollo de productos digitales\"\/><\/a><\/figure>\n\n\n\n<p><strong>Seguir leyendo<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. \u00bfY el rendimiento?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Ferrocarriles y otros medios de transporte<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">Desarrollo Rails con TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>En el segundo episodio de nuestra modularizaci\u00f3n Ruby on Rails con Packwerk vamos a examinar detenidamente el concepto de aplicaci\u00f3n como paquete.<\/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\/es\/blog\/modularizacion-de-ruby-on-rails-con-packwerk-episodio-ii\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/blog\/modularizacion-de-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 minutos\" \/>\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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\\\/es\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ruby on Rails modularizaci\u00f3n con Packwerk Episodio II - The Codest","description":"En el segundo episodio de nuestra modularizaci\u00f3n Ruby on Rails con Packwerk vamos a examinar detenidamente el concepto de aplicaci\u00f3n como paquete.","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\/es\/blog\/modularizacion-de-ruby-on-rails-con-packwerk-episodio-ii\/","og_locale":"es_ES","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\/es\/blog\/modularizacion-de-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 minutos"},"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":"es","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 modularizaci\u00f3n 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":"En el segundo episodio de nuestra modularizaci\u00f3n Ruby on Rails con Packwerk vamos a examinar detenidamente el concepto de aplicaci\u00f3n como paquete.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"es"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"es","@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\/es\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}