{"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-modularizace-s-packwerk-dil-ii","status":"publish","type":"post","link":"https:\/\/thecodest.co\/cs\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/","title":{"rendered":"Modularizace Ruby on Rails pomoc\u00ed Packwerk Episode II"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Aplikace jako bal\u00ed\u010dek<\/h2>\n\n\n\n<p>P\u0159\u00edstup k modularizaci na\u0161\u00ed aplikace spo\u010d\u00edv\u00e1 v p\u0159eveden\u00ed cel\u00e9 aplikace do bal\u00ed\u010dku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vytvo\u0159en\u00ed struktury<\/h3>\n\n\n\n<p>Nejprve mus\u00edme vytvo\u0159it <code>app\/packages<\/code> do kter\u00e9 um\u00edst\u00edme v\u0161echny na\u0161e bal\u00ed\u010dky. Abychom na\u0161e bal\u00ed\u010dky odd\u011blili, mus\u00edme ka\u017edou <strong>Koncept MVC<\/strong> v jedn\u00e9 slo\u017ece. Vezmeme-li <strong>CodeTriage <a href=\"https:\/\/thecodest.co\/cs\/dictionary\/why-do-projects-fail\/\">projekt<\/a><\/strong> jako p\u0159\u00edklad n\u00e1m poslou\u017e\u00ed n\u00e1sleduj\u00edc\u00ed obr\u00e1zek.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/2.png\" alt=\"struktura bal\u00ed\u010dku \" title=\"p\u0159\u00edklad struktury bal\u00ed\u010dku\"\/><\/figure>\n\n\n\n<p>Pokud se pokus\u00edme server spustit, nepoda\u0159\u00ed se n\u00e1m konstanty naj\u00edt. Proto mus\u00edme p\u0159idat \u0159\u00e1dek konfigurace do na\u0161eho <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>Nyn\u00ed aplikace funguje, ale nem\u016f\u017ee naj\u00edt pohledy, tak\u017ee mus\u00edme p\u0159idat dal\u0161\u00ed \u0159\u00e1dek konfigurace do na\u0161\u00ed aplikace. <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\/cs\/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\">Vytvo\u0159en\u00ed bal\u00ed\u010dk\u016f<\/h3>\n\n\n\n<p>Na\u0161e struktura je p\u0159ipravena, tak\u017ee nyn\u00ed m\u016f\u017eeme za\u010d\u00edt vytv\u00e1\u0159et bal\u00ed\u010dky. K tomu pot\u0159ebujeme pouze p\u0159idat polo\u017eku<code>package.yml<\/code> do ka\u017ed\u00e9 slo\u017eky s n\u00e1sleduj\u00edc\u00ed konfigurac\u00ed:<\/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=\"p\u0159\u00edklad package.yml\"\/><\/figure>\n\n\n\n<p><code>enforce_privacy<\/code>poskytuje <a href=\"https:\/\/thecodest.co\/cs\/blog\/why-us-companies-are-opting-for-polish-developers\/\">n\u00e1s<\/a> mo\u017enost izolovat v\u0161echny konstanty bal\u00ed\u010dku a pracovat s ve\u0159ejn\u00fdm <a href=\"https:\/\/thecodest.co\/cs\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a>. Abychom mohli vystavit ve\u0159ejn\u00e9 konstanty, mus\u00edme p\u0159idat konstanty do, nap\u0159.&nbsp;<code>packages\/users\/app\/public.<\/code>Prozat\u00edm nastav\u00edme tuto konfiguraci na hodnotu <em> false<\/em>.<\/p>\n\n\n\n<p><code>enforce_dependencies<\/code> vynut\u00ed z\u00e1vislost bal\u00ed\u010dku a zkontroluje v\u0161echny odkazy na konstanty. Pokud z\u00e1vislost nen\u00ed explicitn\u011b definov\u00e1na, jedn\u00e1 se o poru\u0161en\u00ed hranice.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ov\u011b\u0159en\u00ed syst\u00e9mu bal\u00ed\u010dk\u016f<\/h3>\n\n\n\n<p><strong>Packwerk<\/strong> stanovil krit\u00e9rium, kter\u00e9 mus\u00edme dodr\u017eovat, abychom m\u011bli platn\u00fd bal\u00ed\u010dkov\u00fd syst\u00e9m. M\u016f\u017eeme za\u010d\u00edt spou\u0161t\u011bt <code>packwerk validovat<\/code> v na\u0161\u00ed konzoli.<\/p>\n\n\n\n<p>&nbsp;Zkontroluje strukturu slo\u017eek, <strong>konfigurace bal\u00ed\u010dku<\/strong>a automatick\u00e9 na\u010d\u00edt\u00e1n\u00ed mezipam\u011bti cest.<\/p>\n\n\n\n<p>V tuto chv\u00edli na\u0161e aplikace nen\u00ed platn\u00e1 a mus\u00edme opravit cesty na\u010d\u00edt\u00e1n\u00ed v aplikaci<strong><code>packwerk.yml<\/code>.<\/strong> K tomu sta\u010d\u00ed p\u0159idat chyb\u011bj\u00edc\u00ed cesty.<\/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# U\u017eivatel\u00e9\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>V tomto okam\u017eiku jsme p\u0159ipraveni zkontrolovat poru\u0161en\u00ed hranic v na\u0161\u00ed aplikaci. Pro kontrolu poru\u0161en\u00ed m\u016f\u017eeme spustit p\u0159\u00edkaz<code>packwerk update-deprecations<\/code> , tento p\u0159\u00edkaz vygeneruje <code>deprecated_references.yml<\/code> pro ka\u017ed\u00fd bal\u00ed\u010dek. V ka\u017ed\u00e9m souboru najdeme n\u00e1zev bal\u00ed\u010dku, typ poru\u0161en\u00ed a cestu k souboru. D\u00edky v\u0161em t\u011bmto informac\u00edm v\u00edme, kde k poru\u0161en\u00ed doch\u00e1z\u00ed, a m\u016f\u017eeme se rozhodnout pro jeho \u0159e\u0161en\u00ed.<\/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=\"p\u0159\u00edklad souboru 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    poru\u0161en\u00ed:\n    - z\u00e1vislost\n    soubory:\n    - app\/packages\/users\/models\/user.rb<\/code><\/pre>\n\n\n\n<p>Na tomto p\u0159\u00edkladu pop\u00ed\u0161eme v\u0161echny \u010d\u00e1sti generovan\u00fdch informac\u00ed.<br>podle <strong>Packwerk<\/strong>.<\/p>\n\n\n\n<p>- <code>app\/packages\/repos<\/code> &nbsp;- bal\u00ed\u010dek, kde je poru\u0161en\u00ed konstanty<br>nalezeno.<\/p>\n\n\n\n<p>- <code>::Repo<\/code> &nbsp;- cesta k souboru obsahuj\u00edc\u00edmu poru\u0161enou konstantu.<\/p>\n\n\n\n<p>- <code>z\u00e1vislost<\/code> &nbsp;- typ poru\u0161en\u00ed, a\u0165 u\u017e z\u00e1vislosti, nebo soukrom\u00ed.<\/p>\n\n\n\n<p>- <code>app\/packages\/users\/models\/user.rb<\/code> &nbsp;- cesta k souboru obsahuj\u00edc\u00edmu poru\u0161enou konstantu.<\/p>\n\n\n\n<p>Jako posledn\u00ed krok v t\u00e9to \u010d\u00e1sti nezapome\u0148te p\u0159idat nov\u011b vygenerovan\u00e9 cesty k soubor\u016fm do slo\u017eky <code>packwerk.ym<\/code>l a znovu spustit ov\u011b\u0159ov\u00e1n\u00ed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vizualizace z\u00e1vislost\u00ed<\/h3>\n\n\n\n<p>Se v\u0161emi informacemi v souboru package.yml a <code>deprecated_references.yml<\/code>pak m\u016f\u017eeme<br>vizualizovat graf z\u00e1vislost\u00ed. K tomu pot\u0159ebujeme p\u0159idat dal\u0161\u00ed drahokam, v tomto p\u0159\u00edpad\u011b pou\u017eijeme p\u0159\u00edkaz <a href=\"https:\/\/github.com\/mquan\/pocky\" rel=\"nofollow\">Pocky<\/a>.<\/p>\n\n\n\n<p>B\u011bhaj\u00edc\u00ed hr\u00e1b\u011b <code>pocky:generate<\/code> vygenerujeme soubor s n\u00e1zvem <code>packwerk.png<\/code> kde m\u016f\u017eeme vizualizovat n\u00e1\u0161 prvn\u00ed graf z\u00e1vislost\u00ed.<\/p>\n\n\n\n<p>Po definov\u00e1n\u00ed v\u0161ech bal\u00ed\u010dk\u016f bude n\u00e1\u0161 graf vypadat takto.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/5.png\" alt=\"graf bez p\u0159ijat\u00fdch z\u00e1vislost\u00ed\" title=\"p\u0159\u00edklad grafu bez p\u0159ijat\u00fdch z\u00e1vislost\u00ed\"\/><\/figure>\n\n\n\n<p>z\u00e1vislosti ji\u017e existuj\u00ed, ale neznamen\u00e1 to, \u017ee jsou akceptov\u00e1ny syst\u00e9mem <strong>Packwerk<\/strong>. Na<br>p\u0159ijmout z\u00e1vislost, mus\u00edme p\u0159idat konfiguraci z\u00e1vislost\u00ed do souboru <code>package.yml<\/code><br>v ka\u017ed\u00e9m balen\u00ed. Zam\u011b\u0159\u00edme se na <code>mail_builders<\/code> proto\u017ee se jedn\u00e1 o bal\u00ed\u010dek bez kruhov\u00e9 z\u00e1vislosti. Za zm\u00ednku stoj\u00ed, \u017ee <strong>Packwerk<\/strong> n\u00e1m nedovol\u00ed p\u0159ijmout kruhov\u00e9 z\u00e1vislosti.<\/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>Po p\u0159id\u00e1n\u00ed t\u00e9to konfigurace, <strong>Pocky<\/strong> podbarv\u00ed p\u0159ijat\u00e9 z\u00e1vislosti zelen\u011b.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/6.png\" alt=\"graf s p\u0159ijat\u00fdmi z\u00e1vislostmi \" title=\"p\u0159\u00edklad grafu bez p\u0159ijat\u00fdch z\u00e1vislost\u00ed\"\/><\/figure>\n\n\n\n<p>M\u016f\u017eeme odstranit <code>deprecated_references.yml<\/code> z <code>app\/packages\/mail_builders<\/code> a spustit<br><code>packwerk update-deprecations<\/code> znovu. Soubor nebude znovu vygenerov\u00e1n, proto\u017ee v\u0161echny<br>u tohoto bal\u00ed\u010dku byla opravena poru\u0161en\u00ed. D\u016fle\u017eit\u00e9 je zm\u00ednit, \u017ee i kdy\u017e nebudeme Graph s p\u0159ijat\u00fdmi z\u00e1vislostmi<\/p>\n\n\n\n<p><strong><a href=\"https:\/\/thecodest.co\/cs\/blog\/hire-ror-developer\/\">Ruby<\/a> modularizace v syst\u00e9mu Rails pomoc\u00ed Packwerk<\/strong> akceptovat z\u00e1vislosti, na\u0161e aplikace bude st\u00e1le fungovat jako d\u0159\u00edve, ale nyn\u00ed m\u00e1me k dispozici v\u00edce<br>informace pro rozhodov\u00e1n\u00ed a refaktorizaci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Odstran\u011bn\u00ed kruhov\u00fdch z\u00e1vislost\u00ed<\/h3>\n\n\n\n<p>V na\u0161em p\u0159edchoz\u00edm grafu jsme m\u011bli mnoho kruhov\u00fdch z\u00e1vislost\u00ed, kter\u00e9 bylo t\u0159eba n\u011bjak vy\u0159e\u0161it. K tomu m\u00e1me r\u016fzn\u00e9 strategie:<\/p>\n\n\n\n<p>- Ned\u011blejte nic,<\/p>\n\n\n\n<p>- P\u0159ijmout z\u00e1vislosti, Slou\u010dit bal\u00ed\u010dky,<\/p>\n\n\n\n<p>- P\u0159esun <a href=\"https:\/\/thecodest.co\/cs\/dictionary\/what-is-code-refactoring\/\">k\u00f3d<\/a> mezi bal\u00ed\u010dky,<\/p>\n\n\n\n<p>- Duplikovat funkci,&nbsp;<\/p>\n\n\n\n<p>- Prove\u010fte funkci Dependency injection nebo Dependency injection s typov\u00e1n\u00edm.<\/p>\n\n\n\n<p>Jedn\u00edm z probl\u00e9m\u016f je, \u017ee abychom mohli prov\u00e9st spr\u00e1vn\u00fd refaktor, mus\u00edme zn\u00e1t k\u00f3dovou z\u00e1kladnu. Vzhledem k tomu, \u017ee k\u00f3dovou z\u00e1kladnu tohoto projektu nezn\u00e1m, proto\u017ee jsem ji bral jako p\u0159\u00edklad, tak z praktick\u00fdch d\u016fvod\u016f zvol\u00edme prvn\u00ed strategii, tedy ned\u011blat nic. I kdy\u017e se v\u011bt\u0161in\u011b refaktoringu vyhneme, chceme pracovat na z\u00e1vislostech v r\u00e1mci <em>root<\/em> bal\u00ed\u010dek.<\/p>\n\n\n\n<p>Ko\u0159enov\u00fd bal\u00ed\u010dek obsahuje v\u0161echna lepidla z bal\u00ed\u010dku <strong>R\u00e1mec Rails<\/strong>, v\u0161echny t\u0159\u00eddy, od kter\u00fdch d\u011bd\u00edme, a zajistit, aby v\u0161echny fungovaly spole\u010dn\u011b. Abychom tedy vy\u0159e\u0161ili kruhov\u00e9 z\u00e1vislosti, vytvo\u0159\u00edme v r\u00e1mci n\u00e1sleduj\u00edc\u00edch krok\u016f nov\u00fd bal\u00ed\u010dek s n\u00e1zvem rails:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>P\u0159esunut\u00ed v\u0161ech soubor\u016f a slo\u017eek aplikace do slo\u017eky <code>app\/packages\/rails<\/code>.<\/li>\n\n\n\n<li>Vytvo\u0159it<code>package.yml<\/code> pro bal\u00ed\u010dek se stejnou konfigurac\u00ed jako p\u0159edchoz\u00ed bal\u00ed\u010dky.<\/li>\n\n\n\n<li>P\u0159idejte v\u0161echny nov\u00e9 cesty k soubor\u016fm do <code>packwerk.yml<\/code>.<\/li>\n\n\n\n<li>P\u0159idat <code>app\/packages\/rails<\/code> jako z\u00e1vislost na ostatn\u00edch bal\u00ed\u010dc\u00edch.<\/li>\n<\/ol>\n\n\n\n<p>Po vytvo\u0159en\u00ed bal\u00ed\u010dku si za\u010dneme v\u0161\u00edmat mnoha soubor\u016f, kter\u00e9 lze restrukturalizovat. Po p\u0159esunut\u00ed v\u0161eho do p\u0159\u00edslu\u0161n\u00e9ho bal\u00ed\u010dku a p\u0159ijet\u00ed<br>z\u00e1vislost\u00ed z\u00edsk\u00e1me novou strukturu a \u010dist\u0161\u00ed graf.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/graph.png\" alt=\"Struktura bal\u00ed\u010dku s bal\u00ed\u010dkem rails \" title=\"Struktura bal\u00ed\u010dku s p\u0159\u00edkladem bal\u00ed\u010dku rails\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/8.png\" alt=\"Graf bez ko\u0159enov\u00fdch kruhov\u00fdch z\u00e1vislost\u00ed\" title=\"P\u0159\u00edklad grafu bez ko\u0159enov\u00fdch kruhov\u00fdch z\u00e1vislost\u00ed\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Odstran\u011bn\u00ed z\u00e1vislost\u00ed z ko\u0159enov\u00e9ho bal\u00ed\u010dku<\/h3>\n\n\n\n<p>Nyn\u00ed n\u00e1\u0161 graf vypad\u00e1 mnohem l\u00e9pe, bylo by skv\u011bl\u00e9, kdybychom mohli odstranit v\u0161echny z\u00e1vislosti z ko\u0159enov\u00e9ho bal\u00ed\u010dku. Pokud se pod\u00edv\u00e1me do souboru deprecated_references.yml v ko\u0159enov\u00e9m bal\u00ed\u010dku, zjist\u00edme, \u017ee v\u011bt\u0161ina z nich poch\u00e1z\u00ed z bal\u00ed\u010dku <code>test<\/code> , <code>lib\/tasks<\/code> , <code>db<\/code> a <code>konfigurace<\/code><br>slo\u017eka. Abychom tyto z\u00e1vislosti vy\u0159e\u0161ili, vytvo\u0159\u00edme v ka\u017ed\u00e9m bal\u00ed\u010dku slo\u017eku pro testov\u00e1n\u00ed. M\u00edt n\u011bco jako <code>app\/packages\/users\/test<\/code>. D\u00e1le vylou\u010d\u00edme <code>lib\/tasks<\/code> , <code>db<\/code> a <code>konfigurace<\/code>mezi dal\u0161\u00edmi slo\u017ekami z <strong>Packwerk<\/strong> anal\u00fdzu, proto\u017ee tyto z\u00e1vislosti nejsou v na\u0161\u00ed anal\u00fdze d\u016fle\u017eit\u00e9 a nem\u00e1me snadn\u00fd zp\u016fsob, jak je vy\u0159e\u0161it. P\u0159id\u00e1me do na\u0161eho syst\u00e9mu n\u00e1sleduj\u00edc\u00ed <em>packwerk.yml<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"ruby\" class=\"language-ruby\">vylou\u010dit:\n- \"{bin,node_modules,script,tmp,vendor,lib,db,config,perf_scripts}\/**\/*\"\n- \"lib\/tasks\/**\/*.rake\"<\/code><\/pre>\n\n\n\n<p>Po p\u0159esunut\u00ed v\u0161ech test\u016f z ko\u0159enov\u00e9ho bal\u00ed\u010dku a vylou\u010den\u00ed slo\u017eek z anal\u00fdzy z\u00edsk\u00e1me nov\u00fd graf bez ko\u0159enov\u00fdch z\u00e1vislost\u00ed.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/9.png\" alt=\"Graf bez ko\u0159enov\u00fdch z\u00e1vislost\u00ed\" title=\"Graf bez ko\u0159enov\u00fdch z\u00e1vislost\u00ed\"\/><\/figure>\n\n\n\n<p>Jak vid\u00edme, st\u00e1le m\u00e1me kruhov\u00e9 z\u00e1vislosti v oblasti<code>u\u017eivatel\u00e9<\/code> , <code>repozit\u00e1\u0159e<\/code> a <code>dokumenty<\/code> . I kdy\u017e jsme je nevy\u0159e\u0161ili, m\u00e1me nyn\u00ed d\u016fle\u017eit\u00e9 informace, kter\u00e9 m\u016f\u017eeme p\u0159edat. V\u00edme, \u017ee ka\u017ed\u00fd <a href=\"https:\/\/thecodest.co\/cs\/blog\/how-to-hire-the-best-outsourced-development-team-for-a-scaleup\/\">t\u00fdm<\/a> kter\u00fd provede zm\u011bny v jednom z t\u011bchto bal\u00ed\u010dk\u016f, bude pravd\u011bpodobn\u011b muset prov\u00e9st zm\u011bny v bal\u00ed\u010dc\u00edch s kruhovou z\u00e1vislost\u00ed. Na druhou stranu v\u00edme, \u017ee t\u00fdm m\u016f\u017ee pracovat na <code>github_fetchers<\/code> v\u00fdhradn\u011b znalost bal\u00ed\u010dk\u016f, kter\u00e9 jsou<br>se v ka\u017ed\u00e9m okam\u017eiku m\u011bn\u00ed.<\/p>\n\n\n\n<p>Kone\u010dn\u00fd v\u00fdsledek projektu najdete <a href=\"https:\/\/github.com\/niconisoria\/codetriage-packwerk\" rel=\"nofollow\">zde<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dal\u0161\u00ed krok<\/h3>\n\n\n\n<p>V dal\u0161\u00edm kroku byste mohli v ka\u017ed\u00e9m bal\u00ed\u010dku zajistit konstantn\u00ed soukrom\u00ed a zp\u0159\u00edstupnit pouze ve\u0159ejn\u00e9 rozhran\u00ed API, kter\u00e9 bude p\u0159\u00edstupn\u00e9 z jin\u00fdch bal\u00ed\u010dk\u016f. M\u016f\u017eete snadno nakonfigurovat, kde bude va\u0161e rozhran\u00ed API um\u00edst\u011bno v \u010d\u00e1sti <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\">Z\u00e1v\u011bry<\/h2>\n\n\n\n<p><strong>Packwerk<\/strong> n\u00e1m poskytuje mnoho informac\u00ed o na\u0161\u00ed aplikaci a na z\u00e1klad\u011b t\u011bchto informac\u00ed m\u016f\u017eeme p\u0159ij\u00edmat rozhodnut\u00ed, kter\u00e1 zlep\u0161\u00ed pracovn\u00ed postupy na\u0161ich t\u00fdm\u016f. I kdy\u017e se zd\u00e1lo, \u017ee proces je dlouh\u00fd a s mnoha konfiguracemi, nemus\u00ed tomu tak b\u00fdt v\u017edy. M\u016f\u017eeme za\u010d\u00edt vytv\u00e1\u0159et bal\u00ed\u010dky pouze pro nov\u00fd k\u00f3d p\u0159idan\u00fd do na\u0161\u00ed aplikace a postupn\u011b jej modulovat. Nyn\u00ed tedy m\u016f\u017eeme za\u010d\u00edt mluvit o postupn\u00e9 modularizaci, co\u017e je koncept, kter\u00fd p\u0159edstavil Stephan Hagemann <em>\"Poprv\u00e9 se m\u016f\u017eeme rozhodnout za\u010d\u00edt modulovat \u010d\u00e1st k\u00f3du aspira\u010dn\u00edm zp\u016fsobem... To n\u00e1m umo\u017e\u0148uje vytv\u00e1\u0159et postupn\u011b se roz\u0161i\u0159uj\u00edc\u00ed syst\u00e9m podpory sm\u011brem k lep\u0161\u00ed struktu\u0159e aplikace.\"<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zdroje<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/leanpub.com\/package-based-rails-applications\" rel=\"nofollow\">Postupn\u00e1 modularizace pro Ruby on Rails - Stephan Hagemann<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/shopify.engineering\/enforcing-modularity-rails-apps-packwerk\">Vynucov\u00e1n\u00ed modularity v aplikac\u00edch Rails pomoc\u00ed Packwerku<\/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\">Zdrojov\u00fd k\u00f3d \u010dl\u00e1nku<\/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=\"Poradenstv\u00ed v oblasti v\u00fdvoje digit\u00e1ln\u00edch produkt\u016f\"\/><\/a><\/figure>\n\n\n\n<p><strong>P\u0159e\u010dt\u011bte si v\u00edce<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/graphql-ruby-what-about-performance\">GraphQL Ruby. Jak je to s v\u00fdkonem?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-and-other-means-of-transport\">Kolejnice a dal\u0161\u00ed dopravn\u00ed prost\u0159edky<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/thecodest.co\/blog\/rails-development-with-tmux-vim-fzf-ripgrep\">V\u00fdvoj Rails pomoc\u00ed TMUX, Vim, Fzf + Ripgrep<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Ve druh\u00e9m d\u00edle na\u0161eho seri\u00e1lu o modularizaci Ruby on Rails s Packwerkem se bl\u00ed\u017ee pod\u00edv\u00e1me na koncept aplikace jako bal\u00ed\u010dku.<\/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\/cs\/blog\/ruby-on-rails-modularizace-s-packwerk-dil-ii\/\" \/>\n<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/blog\/ruby-on-rails-modularizace-s-packwerk-dil-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 minut\" \/>\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\":\"cs\",\"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\":\"cs\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/ruby-on-rails-modularization-with-packwerk-episode-ii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"cs\",\"@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\":\"cs\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"cs\",\"@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\":\"cs\",\"@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\\\/cs\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Modularizace Ruby on Rails s Packwerk Episode II - The Codest","description":"Ve druh\u00e9m d\u00edle na\u0161eho seri\u00e1lu o modularizaci Ruby on Rails s Packwerkem se bl\u00ed\u017ee pod\u00edv\u00e1me na koncept aplikace jako bal\u00ed\u010dku.","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\/cs\/blog\/ruby-on-rails-modularizace-s-packwerk-dil-ii\/","og_locale":"cs_CZ","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\/cs\/blog\/ruby-on-rails-modularizace-s-packwerk-dil-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 minut"},"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":"cs","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":"Modularizace Ruby on Rails s 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":"Ve druh\u00e9m d\u00edle na\u0161eho seri\u00e1lu o modularizaci Ruby on Rails s Packwerkem se bl\u00ed\u017ee pod\u00edv\u00e1me na koncept aplikace jako bal\u00ed\u010dku.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/#breadcrumb"},"inLanguage":"cs","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/ruby-on-rails-modularization-with-packwerk-episode-ii\/"]}]},{"@type":"ImageObject","inLanguage":"cs","@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":"cs"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"cs","@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":"cs","@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\/cs\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/posts\/3566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/comments?post=3566"}],"version-history":[{"count":10,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/posts\/3566\/revisions"}],"predecessor-version":[{"id":7983,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/posts\/3566\/revisions\/7983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/media\/3567"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/media?parent=3566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/categories?post=3566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/cs\/wp-json\/wp\/v2\/tags?post=3566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}