{"id":34744,"date":"2019-10-31T22:00:10","date_gmt":"2019-10-31T19:00:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/monorepozitorii-pozhalujsta-nado\/"},"modified":"2019-10-31T22:00:10","modified_gmt":"2019-10-31T19:00:10","slug":"monorepozitorii-pozhalujsta-nado","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monorepositorios: por favor, es necesario","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monorepositorios: por favor, es necesario\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>La traducci\u00f3n del art\u00edculo se ha preparado para los estudiantes del curso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u00abPr\u00e1cticas y herramientas de DevOps\u00bb<\/a><\/noindex> en el proyecto educativo OTUS.<\/em><\/p>\n<p>Deber\u00edas optar por un monorepo, porque el comportamiento que promueve dentro de tus equipos es la transparencia y la responsabilidad colectiva, especialmente a medida que los equipos crecen. En cualquier caso, tendr\u00e1s que invertir en herramientas, pero siempre es mejor cuando el comportamiento predeterminado es el que deseas ver en tus equipos. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">\u00bfPor qu\u00e9 hablamos de esto?<\/h1>\n<p><\/p>\n<p>Matt Klein escribi\u00f3 un art\u00edculo <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u00abMonorepos: \u00a1Por favor, no lo hagan!\u00bb<\/a><\/noindex>\u200a (nota del traductor: traducci\u00f3n en Habr <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u00abMonorepos: por favor no lo hagan\u00bb<\/a><\/noindex>). Me gusta Matt, creo que es muy inteligente, y deber\u00edas leer su perspectiva. Inicialmente public\u00f3 una encuesta en Twitter:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monorepositorios: por favor, es necesario\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Traducci\u00f3n:<\/em><br \/>\n<em>En este d\u00eda de A\u00f1o Nuevo, discutir\u00e9 cu\u00e1n absurdo es el uso de monorepos. El 2019 comenz\u00f3 de manera bastante silenciosa. En ese esp\u00edritu, te propongo una encuesta. \u00bfQui\u00e9nes son los grandes fan\u00e1ticos? Favorables:<\/em><br \/>\n\u2014 <em>Monorepo<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>Encuesta err\u00f3nea \/ ambos<\/em><\/p>\n<p><\/p>\n<p>Mi respuesta fue: \u00abLiteralmente soy ambas personas\u00bb. En lugar de hablar sobre qu\u00e9 tan adictivo es Rust, exploremos por qu\u00e9 creo que est\u00e1 equivocado acerca de los monorepos. Un poco sobre m\u00ed. Soy el director t\u00e9cnico de Chef Software. Tenemos alrededor de 100 ingenieros, una base de c\u00f3digo que tiene entre 11 y 12 a\u00f1os, y 4 productos principales. Parte de este c\u00f3digo se encuentra en un polirepo (mi posici\u00f3n inicial), y parte en un monorepo (mi posici\u00f3n actual).<\/p>\n<p><\/p>\n<p>Antes de comenzar: cada argumento que presento aqu\u00ed se aplicar\u00e1 a ambos tipos de repositorios. En mi opini\u00f3n, no hay razones t\u00e9cnicas por las cuales debas elegir un tipo de repositorio sobre el otro. Puedes hacer que cualquier enfoque funcione. Estoy feliz de hablar sobre esto, pero no me interesan razones t\u00e9cnicas artificiales que sugieran que uno es superior al otro. <\/p>\n<p><\/p>\n<p>Estoy de acuerdo con la primera parte de la perspectiva de Matt:<\/p>\n<p><\/p>\n<p><em>Porque a gran escala, un monorepo afrontar\u00e1 los mismos problemas que resuelve un polirepo, pero adem\u00e1s te provocar\u00e1 a una fuerte cohesi\u00f3n de tu c\u00f3digo y requerir\u00e1 esfuerzos extraordinarios para escalar tu sistema de control de versiones.<\/em><\/p>\n<p><\/p>\n<p>Te enfrentas a los mismos problemas sin importar si eliges un monorepositorio o un polirepositorio. \u00bfC\u00f3mo lanzas tus versiones? \u00bfCu\u00e1l es tu enfoque hacia las actualizaciones? \u00bfCompatibilidad retroactiva? \u00bfDependencias cruzadas entre proyectos? \u00bfQu\u00e9 estilos arquitect\u00f3nicos son aceptables? \u00bfC\u00f3mo gestionas tu infraestructura de construcci\u00f3n y pruebas? La lista es interminable. Y los resolver\u00e1s a medida que crezcas. No hay tal cosa como el queso gratis.<\/p>\n<p><\/p>\n<p>Creo que el argumento de Matt se asemeja a las opiniones compartidas por muchos ingenieros (y gerentes) que respeto. Proviene de la perspectiva de un ingeniero que trabaja en un componente, o de un equipo que trabaja en un componente. Escuchas cosas como:<\/p>\n<p><\/p>\n<ul>\n<li>La base de c\u00f3digo es voluminosa; no necesito toda esta basura.<\/li>\n<li>Es m\u00e1s complicado de probar porque tengo que verificar toda esta chatarra que no necesito.<\/li>\n<li>Es m\u00e1s dif\u00edcil trabajar con dependencias externas.<\/li>\n<li>Necesito mis propios sistemas virtuales de control de versiones.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sin duda, todos estos puntos son v\u00e1lidos. Esto ocurre en ambos casos: en el polirepositorio tengo mi propio desorden, adem\u00e1s del que necesito para la construcci\u00f3n... Puede que necesite m\u00e1s desorden. Por eso 'simplemente' creo herramientas que realizan el checkout de todo el proyecto. O creo un monorepositorio falso con subm\u00f3dulos. Podr\u00edamos estar discutiendo sobre esto todo el d\u00eda. Pero creo que el argumento de Matt omite la raz\u00f3n fundamental que he resaltado a favor del monorepositorio:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Fomenta la comunicaci\u00f3n y revela problemas.<\/h1>\n<p><\/p>\n<p>Cuando separamos los repositorios, de facto creamos un problema de coordinaci\u00f3n y transparencia. Esto se alinea con c\u00f3mo pensamos sobre los equipos (especialmente c\u00f3mo piensan sus miembros individuales): somos responsables de un componente espec\u00edfico. Trabajamos en relativa aislamiento. Los l\u00edmites se fijan en mi equipo y en el\/los componente(s) en los que estamos trabajando.<\/p>\n<p><\/p>\n<p>A medida que la arquitectura se complica, un solo equipo ya no puede gestionarla por s\u00ed solo. Muy pocos ingenieros mantienen todo el sistema en su cabeza. Supongamos que gestionas un componente com\u00fan A, que es utilizado por los equipos B, C y D. El equipo A realiza una refactorizaci\u00f3n, mejora la API y tambi\u00e9n cambia la implementaci\u00f3n interna. Como resultado, los cambios son incompatible hacia atr\u00e1s. \u00bfQu\u00e9 consejo dar\u00edas?<\/p>\n<p><\/p>\n<ul>\n<li>Encuentra todos los lugares donde se usa la antigua API.<\/li>\n<li>\u00bfHay lugares donde no se puede usar la nueva API?<\/li>\n<li>\u00bfPuedes corregir y probar otros componentes para asegurarte de que no se rompan?<\/li>\n<li>\u00bfPueden estos equipos verificar tus cambios ahora mismo?<\/li>\n<\/ul>\n<p><\/p>\n<p>Ten en cuenta que estas preguntas no dependen del tipo de repositorio. Tendr\u00e1s que encontrar a los equipos B, C y D. Necesitar\u00e1s hablar con ellos, averiguar su tiempo, comprender sus prioridades. Al menos, esperamos que lo hagas.<\/p>\n<p><\/p>\n<p>De hecho, a nadie le gusta hacer esto. Es mucho menos emocionante que simplemente arreglar maldita sea la API. Todo esto es humano y complicado. En un polirepositorio, puedes simplemente realizar cambios, someterlo a revisi\u00f3n a quienes trabajan en ese componente (probablemente no a B, C o D), y seguir adelante. Los equipos B, C y D pueden mantenerse en su versi\u00f3n actual por ahora. Actualizar\u00e1n cuando se den cuenta de tu genialidad.<\/p>\n<p><\/p>\n<p>En un monorepositorio, la responsabilidad se desplaza por defecto. El equipo A cambia su componente y, si no tiene cuidado, inmediatamente rompe B, C y D. Esto lleva a que B, C y D aparezcan en la puerta de A, pregunt\u00e1ndose por qu\u00e9 el equipo A rompi\u00f3 la compilaci\u00f3n. Esto ense\u00f1a a A que no pueden ignorar mi lista anterior. Deben hablar sobre lo que planean hacer. \u00bfPueden B, C y D avanzar? \u00bfQu\u00e9 pasar\u00eda si B y C pueden, pero D estaba estrechamente relacionado con un efecto secundario del comportamiento del antiguo algoritmo?<\/p>\n<p><\/p>\n<p>Entonces, debemos hablar sobre c\u00f3mo saldremos de esta situaci\u00f3n:<\/p>\n<p><\/p>\n<ol>\n<li>Soporte para m\u00faltiples API internas, mientras que el antiguo algoritmo se marcar\u00e1 como obsoleto, hasta que D pueda dejar de usarlo.<\/li>\n<li>Soporte para m\u00faltiples versiones de lanzamientos, una con la antigua interfaz, otra con la nueva.<\/li>\n<li>Retrasar el lanzamiento de los cambios A hasta que simult\u00e1neamente B, C y D puedan aceptarlo.<\/li>\n<\/ol>\n<p><\/p>\n<p>Supongamos que hemos seleccionado 1, varias API. En este caso, tenemos dos fragmentos de c\u00f3digo. Uno antiguo y uno nuevo. Es bastante conveniente en ciertas situaciones. Revertimos el c\u00f3digo antiguo, lo marcamos como obsoleto (deprecated) y coordinamos el calendario para su eliminaci\u00f3n con el equipo D. Es esencialmente id\u00e9ntico para el polirepositorio y el monorepositorio.<\/p>\n<p><\/p>\n<p>Para lanzar varias versiones necesitamos una rama. Ahora tenemos dos componentes: A1 y A2. Los equipos B y C utilizan A2, mientras que D utiliza A1. Necesitamos que cada componente est\u00e9 listo para su lanzamiento porque, antes de que D pueda avanzar, pueden requerirse actualizaciones de seguridad y correcciones de otros errores. En el polirepositorio, podemos ocultar esto en una rama de larga duraci\u00f3n que se siente bien. En el monorepositorio, forzamos el c\u00f3digo en un nuevo m\u00f3dulo. El equipo D a\u00fan tendr\u00e1 que hacer cambios en el componente \"antiguo\". Todos pueden ver el costo que estamos pagando aqu\u00ed: ahora tenemos el doble de c\u00f3digo, y cualquier correcci\u00f3n de errores que se aplique a A1 y A2 debe aplicarse a ambos. Con el enfoque de uso de ramas en el polirepositorio, esto se oculta detr\u00e1s de cherry-pick. Consideramos el costo como menor porque no hay duplicaci\u00f3n. Desde un punto de vista pr\u00e1ctico, el costo es el mismo: estar\u00e1s creando, lanzando y manteniendo dos bases de c\u00f3digo, en su mayor\u00eda id\u00e9nticas, hasta que puedas eliminar una de ellas. La diferencia es que con el monorepositorio, ese dolor es directo y est\u00e1 a la vista. <strong>Esto es a\u00fan peor, y eso es bueno.<\/strong><\/p>\n<p><\/p>\n<p>Finalmente, hemos llegado al tercer punto. Retraso en el lanzamiento. Es posible que los cambios realizados por A mejoren la situaci\u00f3n del equipo A. Importante, pero no urgente. \u00bfPodemos simplemente retrasarlo? En el monorepositorio, estamos impulsando esto hacia la consolidaci\u00f3n del artefacto. Por supuesto, estamos comunic\u00e1ndolo al equipo D. \u00a1Simplemente qu\u00e9dense en la versi\u00f3n anterior hasta que se pongan al d\u00eda! Esto establece un ambiente de temor. El equipo A contin\u00faa trabajando en su componente, ignorando el hecho de que el equipo D est\u00e1 usando una versi\u00f3n cada vez m\u00e1s obsoleta (ese es un problema del equipo D, son incompetentes). Mientras tanto, el equipo D habla mal de la actitud descuidada del equipo A hacia la estabilidad del c\u00f3digo, si es que hablan de ello. Pasan los meses. Finalmente, el equipo D decide considerar la posibilidad de actualizar, pero los cambios en A solo han aumentado. El equipo A apenas recuerda cu\u00e1ndo y c\u00f3mo da\u00f1aron a D. La actualizaci\u00f3n resulta ser m\u00e1s dolorosa y tomar\u00e1 m\u00e1s tiempo. Lo que lo env\u00eda a\u00fan m\u00e1s abajo en la pila de prioridades. Hasta que un d\u00eda enfrentemos un problema de seguridad en A, lo que nos obliga a hacer una bifurcaci\u00f3n. El equipo A tiene que retroceder en el tiempo, encontrar el momento en que D era estable, arreglar all\u00ed el problema y prepararlo para el lanzamiento. <strong>Es, de facto, una decisi\u00f3n que toman las personas, y sin duda, es la peor.<\/strong> Parece que esto es bueno tanto para el equipo A como para D, siempre que podamos ignorarnos mutuamente.<\/p>\n<p><\/p>\n<p>En un monorepositorio, el tercero realmente no es una opci\u00f3n. Te ves obligado a manejar la situaci\u00f3n de una de dos maneras. Necesitas comprender los costos de tener dos ramas de lanzamiento. Aprender a protegerte de las actualizaciones que rompen la compatibilidad hacia atr\u00e1s. Pero lo m\u00e1s importante: <em>no puedes evitar una conversaci\u00f3n dif\u00edcil.<\/em><\/p>\n<p><\/p>\n<p>Por mi experiencia, cuando los equipos crecen, ya no hay forma de mantener toda la sistema en la mente, y esa es la parte m\u00e1s importante. Debes mejorar la visibilidad de las discrepancias en el sistema. Debes trabajar activamente para hacer que los equipos aparten la vista de sus componentes y miren el trabajo de otros equipos y consumidores.<\/p>\n<p><\/p>\n<p>S\u00ed, puedes crear herramientas que intenten resolver el problema de los polirepositorios. Pero mi experiencia en entrega continua y automatizaci\u00f3n en grandes empresas me dice lo siguiente: el comportamiento por defecto sin el uso de herramientas adicionales es el comportamiento que esperas ver. <strong>El comportamiento por defecto de un polirepositorio es la aislamiento, ese es todo el sentido. El comportamiento por defecto de un monorepositorio es la responsabilidad compartida y la transparencia, ese es todo el sentido.<\/strong> En ambos casos, voy a crear una herramienta que permita suavizar los bordes. Como l\u00edder, elegir\u00e9 un monorepositorio cada vez, porque las herramientas deben fortalecer la cultura que deseo, y la cultura proviene de peque\u00f1as decisiones y del trabajo diario del equipo.<\/p>\n<p class=\"for_users_only_msg\">Solo los usuarios registrados pueden participar en la encuesta. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Inicie sesi\u00f3n<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">\u00bfQui\u00e9nes son los mayores fan\u00e1ticos? Defensores:<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Monorepo<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Rust<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Encuesta err\u00f3nea \/ ambos<\/p>\n<\/li>\n<\/ul>\n<p>    33 usuarios votaron. 13 usuarios se abstuvieron.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/453958\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00abDevOps \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b\u00bb \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 OTUS. \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34744","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0434\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Monorepositorios: por favor, s\u00ed | ProHoster","description":"La traducci\u00f3n del art\u00edculo fue preparada para estudiantes.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0434\u043e | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:10+00:00","article:modified_time":"2019-10-31T19:00:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34744","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 20:28:56","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:15:38","updated":"2026-01-21 20:28:56","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}