{"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":"modularisation-de-ruby-on-rails-avec-packwerk-episode-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/fr\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Ruby on Rails modularisation avec Packwerk Episode II"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Application en tant que paquet<\/h2>\n\n\n\n<p>L'approche de la modularisation de notre application consiste \u00e0 convertir l'ensemble de l'application en un paquet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er la structure<\/h3>\n\n\n\n<p>Tout d'abord, nous devons cr\u00e9er <code>app\/packages<\/code> dans lequel nous placerons tous nos paquets. Afin d'isoler nos paquets, nous devons s\u00e9parer chaque <strong>Concept MVC<\/strong> dans un seul dossier. En prenant le <strong>CodeTriage <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/why-do-projects-fail\/\">projet<\/a><\/strong> \u00e0 titre d'exemple, nous aurons quelque chose comme l'image suivante.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"structure du paquet \" title=\"exemple de structure de paquet\"\/><\/figure>\n\n\n\n<p>Si nous essayons de lancer le serveur, il ne parviendra pas \u00e0 trouver les constantes. C'est pourquoi nous devons ajouter une ligne de configuration \u00e0 notre fichier <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>Maintenant, l'application fonctionne mais elle ne peut pas trouver les vues, nous devons donc ajouter une autre ligne de configuration \u00e0 notre fichier <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\/fr\/blog\/ways-to-increase-your-rails-performance\/\">Rails<\/a>.root.join('app\/packages\/*\/views')))<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er les paquets<\/h3>\n\n\n\n<p>Notre structure \u00e9tant pr\u00eate, nous pouvons maintenant commencer \u00e0 cr\u00e9er les paquets. Pour ce faire, il nous suffit d'ajouter un \u00e9l\u00e9ment<code>package.yml<\/code> dans chaque dossier avec la configuration suivante :<\/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=\"exemple package.yml\"\/><\/figure>\n\n\n\n<p><code>appliquer_la_confidentialit\u00e9<\/code>donne <a href=\"https:\/\/thecodest.co\/fr\/blog\/why-us-companies-are-opting-for-polish-developers\/\">nous<\/a> la possibilit\u00e9 d'isoler toutes les constantes du paquet et de travailler avec un paquet public. <a href=\"https:\/\/thecodest.co\/fr\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Afin d'exposer les constantes publiques, nous devons ajouter les constantes dans, par exemple&nbsp;<code>paquets\/utilisateurs\/app\/public.<\/code>Pour l'instant, nous allons d\u00e9finir cette configuration comme suit <em> faux<\/em>.<\/p>\n\n\n\n<p><code>enforce_dependencies<\/code> va imposer la d\u00e9pendance d'un paquet et v\u00e9rifier toutes les r\u00e9f\u00e9rences constantes. Si une d\u00e9pendance n'est pas explicitement d\u00e9finie, il s'agira d'une violation de la fronti\u00e8re.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Validation du syst\u00e8me de paquets<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> a \u00e9tabli un crit\u00e8re que nous devons respecter pour avoir un syst\u00e8me de paquets valide. Nous pouvons commencer \u00e0 faire fonctionner <code>packwerk valider<\/code> dans notre console.<\/p>\n\n\n\n<p>&nbsp;Cette op\u00e9ration permet de v\u00e9rifier la structure de nos dossiers, <strong>configuration du paquet<\/strong>et le cache de chemin autoload.<\/p>\n\n\n\n<p>Pour l'instant, notre application n'est pas valide et nous devons corriger les chemins d'acc\u00e8s dans la section<strong><code>packwerk.yml<\/code>.<\/strong> Pour ce faire, il suffit d'ajouter les chemins manquants.<\/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# Utilisateurs\n- app\/packages\/users\/contr\u00f4leurs\n- app\/packages\/users\/models\n- app\/packages\/users\/package.yml\n- app\/packages\/users\/views<\/code><\/pre>\n\n\n\n<p>\u00c0 ce stade, nous sommes pr\u00eats \u00e0 v\u00e9rifier les violations de limites dans notre application. Pour v\u00e9rifier les violations, nous pouvons ex\u00e9cuter<code>packwerk update-deprecations<\/code> Cette commande g\u00e9n\u00e8re <code>deprecated_references.yml<\/code> pour chaque paquet. Dans chaque fichier, nous trouverons le nom du paquet, le type de violation et le chemin d'acc\u00e8s au fichier. Gr\u00e2ce \u00e0 toutes ces informations, nous savons o\u00f9 se produit la violation et nous pouvons prendre une d\u00e9cision pour la r\u00e9soudre.<\/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=\"exemple 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    violations :\n    - d\u00e9pendance\n    fichiers :\n    - app\/packages\/users\/models\/user.rb<\/code><\/pre>\n\n\n\n<p>En prenant l'exemple, nous allons d\u00e9crire chaque partie de l'information g\u00e9n\u00e9r\u00e9e.<br>par <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/packages\/repos<\/code> &nbsp;- o\u00f9 la violation de la constante est<br>trouv\u00e9e.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- chemin d'acc\u00e8s au fichier contenant la constante viol\u00e9e.<\/p>\n\n\n\n<p>- <code>d\u00e9pendance<\/code> &nbsp;- un type de violation, soit de la d\u00e9pendance, soit de la vie priv\u00e9e.<\/p>\n\n\n\n<p>- <code>app\/packages\/users\/models\/user.rb<\/code> &nbsp;- chemin d'acc\u00e8s au fichier contenant la constante viol\u00e9e.<\/p>\n\n\n\n<p>Comme derni\u00e8re \u00e9tape de cette section, n'oubliez pas d'ajouter les nouveaux chemins d'acc\u00e8s aux fichiers g\u00e9n\u00e9r\u00e9s dans le fichier <code>packwerk.ym<\/code>l et relancer les validations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visualisation des d\u00e9pendances<\/h3>\n\n\n\n<p>Avec toutes les informations contenues dans package.yml et <code>deprecated_references.yml<\/code>nous pouvons alors<br>visualiser un graphe de d\u00e9pendances. Pour ce faire, nous devons ajouter une autre gemme, dans ce cas nous utiliserons <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>R\u00e2teau en marche <code>pocky:g\u00e9n\u00e9rer<\/code> nous g\u00e9n\u00e9rerons un fichier appel\u00e9 <code>packwerk.png<\/code> o\u00f9 nous pouvons visualiser notre premier graphique de d\u00e9pendances.<\/p>\n\n\n\n<p>Une fois tous les paquets d\u00e9finis, notre graphique se pr\u00e9sente comme suit.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"graphe sans d\u00e9pendances accept\u00e9es\" title=\"Exemple de graphe sans d\u00e9pendances accept\u00e9es\"\/><\/figure>\n\n\n\n<p>existent d\u00e9j\u00e0, mais cela ne signifie pas qu'elles sont accept\u00e9es par <strong>Packwerk<\/strong>. Jusqu'\u00e0<br>accepte une d\u00e9pendance, nous devons ajouter la configuration des d\u00e9pendances au fichier <code>package.yml<\/code><br>dans chaque paquet. Nous nous concentrerons sur <code>constructeurs_de_mails<\/code> puisqu'il s'agit d'un paquet sans d\u00e9pendance circulaire. Il convient de mentionner que <strong>Packwerk<\/strong> ne nous permet pas d'accepter des d\u00e9pendances circulaires.<\/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\nd\u00e9pendances :\n- app\/packages\/docs\n- app\/packages\/issues\n- app\/packages\/repos<\/code><\/pre>\n\n\n\n<p>Apr\u00e8s avoir ajout\u00e9 cette configuration, <strong>Pocky<\/strong> colorera en vert les d\u00e9pendances accept\u00e9es.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"graphe avec d\u00e9pendances accept\u00e9es \" title=\"Exemple de graphe sans d\u00e9pendances accept\u00e9es\"\/><\/figure>\n\n\n\n<p>Nous pouvons supprimer <code>deprecated_references.yml<\/code> de <code>app\/packages\/mail_builders<\/code> et ex\u00e9cuter<br><code>packwerk update-deprecations<\/code> \u00e0 nouveau. Le fichier ne sera pas g\u00e9n\u00e9r\u00e9 \u00e0 nouveau puisque tous les<br>ont \u00e9t\u00e9 corrig\u00e9es pour ce paquet. Il est important de mentionner que m\u00eame si nous ne graphons pas avec des d\u00e9pendances accept\u00e9es<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/fr\/blog\/hire-ror-developer\/\">Rubis<\/a> modularisation sur Rails avec Packwerk<\/strong> accepte les d\u00e9pendances, notre application fonctionnera toujours comme avant, mais nous avons maintenant plus de d\u00e9pendances.<br>des informations pour prendre des d\u00e9cisions et remanier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Supprimer les d\u00e9pendances circulaires<\/h3>\n\n\n\n<p>Dans notre graphique pr\u00e9c\u00e9dent, nous avions beaucoup de d\u00e9pendances circulaires qui devaient \u00eatre r\u00e9solues d'une mani\u00e8re ou d'une autre. Nous disposons de diff\u00e9rentes strat\u00e9gies pour y parvenir :<\/p>\n\n\n\n<p>- Ne rien faire,<\/p>\n\n\n\n<p>- Accepter les d\u00e9pendances, fusionner les paquets,<\/p>\n\n\n\n<p>- D\u00e9placer <a href=\"https:\/\/thecodest.co\/fr\/dictionary\/what-is-code-refactoring\/\">code<\/a> entre les paquets,<\/p>\n\n\n\n<p>- Dupliquer une fonctionnalit\u00e9,&nbsp;<\/p>\n\n\n\n<p>- Effectuer l'injection de d\u00e9pendances ou l'injection de d\u00e9pendances avec typage.<\/p>\n\n\n\n<p>Le probl\u00e8me est que pour effectuer un refactoring correct, nous devons conna\u00eetre la base de code. Je ne suis pas tr\u00e8s familier avec le code de ce projet puisque je l'ai pris comme exemple, donc pour des raisons pratiques nous allons opter pour la premi\u00e8re strat\u00e9gie, ne rien faire. M\u00eame si nous \u00e9viterons la majeure partie du remaniement, nous voulons travailler sur les d\u00e9pendances dans la section <em>racine<\/em> l'emballage.<\/p>\n\n\n\n<p>Le paquet racine contient toutes les colles du programme <strong>Cadre Rails<\/strong>Nous allons donc cr\u00e9er un nouveau paquetage appel\u00e9 rails dans les \u00e9tapes suivantes. Ainsi, afin de r\u00e9soudre les d\u00e9pendances circulaires, nous allons cr\u00e9er un nouveau paquetage appel\u00e9 rails en suivant les \u00e9tapes suivantes :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>D\u00e9placer tous les fichiers et dossiers application_ de l'application vers <code>app\/packages\/rails<\/code>.<\/li>\n\n\n\n<li>Cr\u00e9er un<code>package.yml<\/code> pour le paquet avec la m\u00eame configuration que les paquets pr\u00e9c\u00e9dents.<\/li>\n\n\n\n<li>Ajouter tous les nouveaux chemins d'acc\u00e8s aux fichiers dans <code>packwerk.yml<\/code>.<\/li>\n\n\n\n<li>Ajouter <code>app\/packages\/rails<\/code> en tant que d\u00e9pendance du reste des paquets.<\/li>\n<\/ol>\n\n\n\n<p>Une fois le paquet cr\u00e9\u00e9, nous commencerons \u00e0 remarquer un grand nombre de fichiers qui peuvent \u00eatre restructur\u00e9s. Apr\u00e8s avoir tout d\u00e9plac\u00e9 dans le paquet correspondant et accept\u00e9<br>nous aurons une nouvelle structure et un graphique plus propre.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Structure de l&#039;emballage avec l&#039;emballage des rails \" title=\"Structure de paquetage avec exemple de paquetage de rails\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Graphique sans d\u00e9pendance circulaire de la racine\" title=\"Exemple de graphe sans d\u00e9pendance circulaire de la racine\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Supprimer les d\u00e9pendances du paquet racine<\/h3>\n\n\n\n<p>Maintenant, notre graphique est beaucoup plus beau, ce serait bien si nous pouvions supprimer toutes les d\u00e9pendances du paquet racine. Si nous v\u00e9rifions deprecated_references.yml dans le paquet racine, nous remarquerons que la plupart d'entre elles proviennent de <code>test<\/code> , <code>lib\/t\u00e2ches<\/code> , <code>db<\/code> et <code>config<\/code><br>. Afin de r\u00e9soudre ces d\u00e9pendances, nous allons cr\u00e9er un dossier de test dans chaque paquet. Avoir quelque chose comme <code>app\/packages\/users\/test<\/code>. Ensuite, nous allons exclure <code>lib\/t\u00e2ches<\/code> , <code>db<\/code> et <code>config<\/code>parmi d'autres dossiers de <strong>Packwerk<\/strong> car ces d\u00e9pendances ne sont pas vraiment importantes dans notre analyse et nous n'avons pas de moyen facile de les r\u00e9soudre. Nous ajouterons ce qui suit \u00e0 notre <em>packwerk.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">exclude :\n- \"{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}\/**\/*\"\n- \"lib\/tasks\/**\/*.rake\"<\/code><\/pre>\n\n\n\n<p>Apr\u00e8s avoir d\u00e9plac\u00e9 tous les tests du paquet racine et exclu les dossiers de l'analyse, nous aurons un nouveau graphique sans les d\u00e9pendances racine.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Graphique sans d\u00e9pendances de la racine\" title=\"Graphique sans d\u00e9pendances de la racine\"\/><\/figure>\n\n\n\n<p>Comme nous pouvons le constater, nous avons encore des d\u00e9pendances circulaires dans<code>utilisateurs<\/code> , <code>d\u00e9p\u00f4ts<\/code> et <code>documents<\/code> . Bien que nous ne les ayons pas r\u00e9solus, nous disposons d'informations importantes \u00e0 transmettre maintenant. Nous savons que chaque <a href=\"https:\/\/thecodest.co\/fr\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">\u00e9quipe<\/a> qui effectue des modifications dans l'un de ces paquets devra probablement effectuer des modifications dans les paquets ayant une d\u00e9pendance circulaire. D'autre part, nous savons qu'une \u00e9quipe peut travailler sur <code>github_fetchers<\/code> uniquement, savoir quels sont les paquets<br>se laisser influencer par les changements qui surviennent \u00e0 chaque instant.<\/p>\n\n\n\n<p>Vous pouvez trouver le r\u00e9sultat final du projet <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">ici<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prochaine \u00e9tape<\/h3>\n\n\n\n<p>Dans une prochaine \u00e9tape, vous pourriez imposer une confidentialit\u00e9 constante dans chaque paquet et n'exposer que l'API publique qui sera accessible \u00e0 partir d'autres paquets. Vous pouvez facilement configurer l'emplacement de votre API dans la section <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\">Conclusions<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> nous donne beaucoup d'informations sur notre application et gr\u00e2ce \u00e0 ces informations, nous pouvons prendre des d\u00e9cisions pour am\u00e9liorer le flux de travail de nos \u00e9quipes. Bien que le processus ait sembl\u00e9 long et qu'il ait n\u00e9cessit\u00e9 de nombreuses configurations, il n'est pas n\u00e9cessaire qu'il en soit toujours ainsi. Nous pouvons commencer \u00e0 cr\u00e9er des paquets uniquement pour le nouveau code ajout\u00e9 \u00e0 notre application et ensuite modulariser progressivement. Nous pouvons maintenant commencer \u00e0 parler de la modularisation progressive, un concept introduit par Stephan Hagemann. <em>\"Nous pouvons, pour la premi\u00e8re fois, d\u00e9cider de commencer \u00e0 modulariser une partie du code d'une mani\u00e8re ambitieuse... Cela nous permet de cr\u00e9er un syst\u00e8me de soutien qui s'\u00e9tend progressivement vers une meilleure structure d'application\".<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sources d'information<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Modularisation progressive pour Ruby on Rails - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Renforcer la modularit\u00e9 dans les applications Rails avec 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\">Code source de l'article<\/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=\"Conseil en d\u00e9veloppement de produits num\u00e9riques\"\/><\/a><\/figure>\n\n\n\n<p><strong>Lire la suite<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. Qu'en est-il des performances ?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Rails et autres moyens de transport<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">D\u00e9veloppement Rails avec TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Dans le deuxi\u00e8me \u00e9pisode de notre modularisation Ruby on Rails avec Packwerk, nous allons examiner de pr\u00e8s le concept de l'application en tant que paquet.<\/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\/fr\/blog\/modularisation-de-ruby-on-rails-avec-packwerk-episode-ii\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/blog\/modularisation-de-ruby-on-rails-avec-packwerk-episode-ii\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-10T15:47:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-28T14:05:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\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\":\"fr-FR\",\"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\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@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\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@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\":\"fr-FR\",\"@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\\\/fr\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ruby on Rails modularisation avec Packwerk Episode II - The Codest","description":"Dans le deuxi\u00e8me \u00e9pisode de notre modularisation Ruby on Rails avec Packwerk, nous allons examiner de pr\u00e8s le concept de l'application en tant que paquet.","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\/fr\/blog\/modularisation-de-ruby-on-rails-avec-packwerk-episode-ii\/","og_locale":"fr_FR","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\/fr\/blog\/modularisation-de-ruby-on-rails-avec-packwerk-episode-ii\/","og_site_name":"The Codest","article_published_time":"2022-01-10T15:47:14+00:00","article_modified_time":"2026-04-28T14:05:25+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/ruby_on_rails_modularization_with_packwerk_-__-_episode_2.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"8 minutes"},"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":"fr-FR","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 modularisation avec 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":"Dans le deuxi\u00e8me \u00e9pisode de notre modularisation Ruby on Rails avec Packwerk, nous allons examiner de pr\u00e8s le concept de l'application en tant que paquet.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@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":"fr-FR"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@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":"fr-FR","@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\/fr\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/fr\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}