{"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\/pt\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monoreposit\u00f3rios: por favor, \u00e9 necess\u00e1rio.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monoreposit\u00f3rios: por favor, \u00e9 necess\u00e1rio.\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>A tradu\u00e7\u00e3o do artigo foi preparada para os alunos do curso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u00abPr\u00e1ticas e Ferramentas DevOps\u00bb<\/a><\/noindex> no projeto educacional OTUS.<\/em><\/p>\n<p>Voc\u00ea deve escolher um monoreposit\u00f3rio, porque o comportamento que ele promove em suas equipes \u00e9 a transpar\u00eancia e a responsabilidade coletiva, especialmente \u00e0 medida que as equipes crescem. De qualquer forma, voc\u00ea ter\u00e1 que investir em ferramentas, mas sempre \u00e9 melhor quando o comportamento padr\u00e3o \u00e9 aquele que voc\u00ea deseja ver em suas equipes. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">Por que estamos falando sobre isso?<\/h1>\n<p><\/p>\n<p>Matt Klein escreveu um artigo <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u00abMonorepos: Please don\u2019t!\u00bb<\/a><\/noindex>\u200a (nota do tradutor: tradu\u00e7\u00e3o no Habr\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u00abMonoreposit\u00f3rios: por favor, n\u00e3o\u00bb<\/a><\/noindex>). Eu gosto do Matt, acho que ele \u00e9 muito inteligente, e voc\u00ea deve ler seu ponto de vista. Inicialmente, ele publicou uma pesquisa no Twitter:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monoreposit\u00f3rios: por favor, \u00e9 necess\u00e1rio.\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Tradu\u00e7\u00e3o:<\/em><br \/>\n<em>Neste dia de Ano Novo, vou discutir o qu\u00e3o absurdos s\u00e3o os monoreposit\u00f3rios. O ano de 2019 come\u00e7ou discretamente. No esp\u00edrito disso, proponho a voc\u00eas uma pesquisa. Quem s\u00e3o os grandes fan\u00e1ticos? Apoiante:<\/em><br \/>\n\u2014 <em>Monoreposit\u00f3rio<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>Pesquisa errada \/ ambos<\/em><\/p>\n<p><\/p>\n<p>Minha resposta foi: \"Eu sou literalmente ambas as pessoas\". Em vez de falar sobre como Rust \u00e9 uma droga, vamos esclarecer por que eu acho que ele est\u00e1 errado sobre os monoreposit\u00f3rios. Um pouco sobre mim. Sou diretor t\u00e9cnico da Chef Software. Temos cerca de 100 engenheiros, uma base de c\u00f3digo que tem aproximadamente 11\u201312 anos e 4 produtos principais. Parte desse c\u00f3digo est\u00e1 em um polireposit\u00f3rio (minha posi\u00e7\u00e3o inicial), parte em um monoreposit\u00f3rio (minha posi\u00e7\u00e3o atual).<\/p>\n<p><\/p>\n<p>Antes de come\u00e7ar: cada argumento que eu apresento aqui se aplicar\u00e1 a ambos os tipos de reposit\u00f3rios. Na minha opini\u00e3o, n\u00e3o existem motivos t\u00e9cnicos para voc\u00ea escolher um tipo de reposit\u00f3rio em detrimento do outro. Voc\u00ea conseguir\u00e1 fazer qualquer abordagem funcionar. Estou feliz em discutir isso, mas n\u00e3o me interessam raz\u00f5es t\u00e9cnicas artificiais que alegam que um \u00e9 superior ao outro. <\/p>\n<p><\/p>\n<p>Concordo com a primeira parte do ponto de vista do Matt:<\/p>\n<p><\/p>\n<p><em>Porque em grande escala, um monoreposit\u00f3rio enfrentar\u00e1 os mesmos problemas que um polireposit\u00f3rio, mas ao mesmo tempo o levar\u00e1 a uma forte coes\u00e3o de seu c\u00f3digo e exigir\u00e1 esfor\u00e7os incr\u00edveis para aumentar a escalabilidade do seu sistema de controle de vers\u00f5es.<\/em><\/p>\n<p><\/p>\n<p>Voc\u00ea ter\u00e1 que resolver os mesmos problemas, independentemente de escolher um monoreposit\u00f3rio ou um polireposit\u00f3rio. Como voc\u00ea lan\u00e7a vers\u00f5es? Qual \u00e9 a sua abordagem para atualiza\u00e7\u00f5es? Compatibilidade reversa? Depend\u00eancias cruzadas entre projetos? Quais estilos arquitet\u00f4nicos s\u00e3o aceit\u00e1veis? Como voc\u00ea gerencia sua infraestrutura de constru\u00e7\u00e3o e testes? A lista \u00e9 intermin\u00e1vel. E voc\u00ea ir\u00e1 resolver todos eles \u00e0 medida que crescer. N\u00e3o existe queijo gr\u00e1tis.<\/p>\n<p><\/p>\n<p>Acredito que o argumento do Matt reflete as opini\u00f5es compartilhadas por muitos engenheiros (e gerentes) que respeito. Isso vem da perspectiva de um engenheiro trabalhando em um componente, ou de uma equipe trabalhando em um componente. Voc\u00ea ouve coisas como:<\/p>\n<p><\/p>\n<ul>\n<li>A base de c\u00f3digo \u00e9 grosseira \u2014 n\u00e3o preciso de toda essa bagun\u00e7a.<\/li>\n<li>\u00c9 mais dif\u00edcil de testar, porque preciso checar toda essa bagun\u00e7a que n\u00e3o preciso.<\/li>\n<li>\u00c9 mais complicado trabalhar com depend\u00eancias externas.<\/li>\n<li>Preciso de meus pr\u00f3prios sistemas virtuais de controle de vers\u00f5es.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sem d\u00favida, todos esses pontos s\u00e3o v\u00e1lidos. Isso acontece em ambos os casos \u2014 no polireposit\u00f3rio eu tenho minha bagun\u00e7a, al\u00e9m da que preciso para a constru\u00e7\u00e3o... Eu posso precisar de mais bagun\u00e7a. Por isso, eu 'simplesmente' crio ferramentas que fazem o checkout de todo o projeto. Ou crio um monoreposit\u00f3rio falso com subm\u00f3dulos. Poder\u00edamos discutir isso o dia todo. Mas acho que o argumento do Matt ignora a raz\u00e3o principal, que eu mudei bastante a favor do monoreposit\u00f3rio:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Ele provoca comunica\u00e7\u00e3o e revela problemas.<\/h1>\n<p><\/p>\n<p>Quando separamos reposit\u00f3rios, de fato criamos um problema de coordena\u00e7\u00e3o e transpar\u00eancia. Isso se alinha \u00e0 forma como pensamos sobre equipes (especialmente \u00e0 maneira como os indiv\u00edduos pensam sobre elas): somos respons\u00e1veis por um determinado componente. Trabalhamos em relativa isola\u00e7\u00e3o. As fronteiras est\u00e3o fixadas em minha equipe e no(s) componente(s) em que trabalhamos.<\/p>\n<p><\/p>\n<p>Com a complexidade da arquitetura, uma equipe n\u00e3o pode mais gerenci\u00e1-la sozinha. Muito poucos engenheiros conseguem manter todo o sistema na cabe\u00e7a. Suponha que voc\u00ea est\u00e1 gerenciando o componente A, que \u00e9 utilizado pelas equipes B, C e D. A equipe A realiza refatora\u00e7\u00e3o, aprimora a API e altera a implementa\u00e7\u00e3o interna. Como resultado, as mudan\u00e7as n\u00e3o s\u00e3o compat\u00edveis com vers\u00f5es anteriores. Que conselho voc\u00ea daria?<\/p>\n<p><\/p>\n<ul>\n<li>Encontre todos os lugares onde a API antiga est\u00e1 sendo utilizada.<\/li>\n<li>H\u00e1 lugares onde a nova API n\u00e3o pode ser utilizada?<\/li>\n<li>Voc\u00ea pode corrigir e testar outros componentes para garantir que eles n\u00e3o quebrem?<\/li>\n<li>Essas equipes podem verificar suas mudan\u00e7as agora?<\/li>\n<\/ul>\n<p><\/p>\n<p>Note que essas quest\u00f5es n\u00e3o dependem do tipo de reposit\u00f3rio. Voc\u00ea precisar\u00e1 localizar as equipes B, C e D. Voc\u00ea precisar\u00e1 conversar com elas, descobrir os prazos e entender suas prioridades. Pelo menos, esperamos que voc\u00ea fa\u00e7a isso.<\/p>\n<p><\/p>\n<p>Na verdade, ningu\u00e9m quer lidar com isso. \u00c9 muito menos emocionante do que simplesmente corrigir uma maldita API. \u00c9 tudo muito humano e complicado. Em um reposit\u00f3rio polido, voc\u00ea pode simplesmente fazer as altera\u00e7\u00f5es, enviar para revis\u00e3o aqueles que trabalham nesse componente (provavelmente n\u00e3o B, C ou D) e seguir em frente. As equipes B, C e D podem ficar na vers\u00e3o atual por enquanto. Elas v\u00e3o atualizar quando perceberem sua genialidade!<\/p>\n<p><\/p>\n<p>Em um monoreposit\u00f3rio, a responsabilidade se desloca por padr\u00e3o. A equipe A altera seu componente e, se n\u00e3o tomar cuidado, imediatamente quebra B, C e D. Isso faz com que B, C e D apare\u00e7am \u00e0 porta de A, perplexos, perguntando por que a equipe A quebrou a constru\u00e7\u00e3o. Isso ensina A que n\u00e3o pode ignorar minha lista acima. Elas devem conversar sobre o que planejam fazer. B, C e D podem avan\u00e7ar? E se B e C puderem, mas D estiver fortemente ligado ao efeito colateral do comportamento do algoritmo antigo?<\/p>\n<p><\/p>\n<p>Ent\u00e3o, precisamos conversar sobre como vamos sair dessa situa\u00e7\u00e3o:<\/p>\n<p><\/p>\n<ol>\n<li>Suporte a m\u00faltiplas APIs internas, com o algoritmo antigo marcado como obsoleto, at\u00e9 que D consiga deixar de usar.<\/li>\n<li>Suporte a m\u00faltiplas vers\u00f5es de lan\u00e7amentos, uma com a interface antiga e outra com a nova.<\/li>\n<li>Atrasar o lan\u00e7amento das mudan\u00e7as de A at\u00e9 que B, C e D possam aceit\u00e1-las simultaneamente.<\/li>\n<\/ol>\n<p><\/p>\n<p>Suponhamos que escolhemos 1, v\u00e1rias APIs. Neste caso, temos dois peda\u00e7os de c\u00f3digo. Antigo e novo. Isso \u00e9 bastante conveniente em algumas situa\u00e7\u00f5es. Retornamos o c\u00f3digo antigo, marcamos como obsoleto (deprecated) e alinhamos um cronograma para sua remo\u00e7\u00e3o com a equipe D. Essencialmente \u00e9 id\u00eantico para pol\u00ed e para monoreposit\u00f3rios.<\/p>\n<p><\/p>\n<p>Para o lan\u00e7amento de v\u00e1rias vers\u00f5es, precisamos de um branch. Agora temos dois componentes \u2014 A1 e A2. As equipes B e C usam A2, enquanto D usa A1. Precisamos que cada componente esteja pronto para o lan\u00e7amento, pois, antes que D possa avan\u00e7ar, podem ser necess\u00e1rias atualiza\u00e7\u00f5es de seguran\u00e7a e corre\u00e7\u00f5es de outros bugs. Em um polireposit\u00f3rio, podemos esconder isso em um branch de longa dura\u00e7\u00e3o, que se sente bem. Em um monoreposit\u00f3rio, for\u00e7amos a cria\u00e7\u00e3o de c\u00f3digo em um novo m\u00f3dulo. A equipe D ainda ter\u00e1 que fazer altera\u00e7\u00f5es no componente \"antigo\". Qualquer um pode ver o custo que estamos pagando aqui \u2014 agora temos o dobro de c\u00f3digo, e quaisquer corre\u00e7\u00f5es de bugs aplicadas a A1 e A2 devem ser aplicadas a ambos. Com a abordagem de usar branches em um polireposit\u00f3rio, isso est\u00e1 escondido sob cherry-pick. Consideramos o custo como menor porque n\u00e3o h\u00e1 duplica\u00e7\u00e3o. Do ponto de vista pr\u00e1tico, o custo \u00e9 o mesmo: voc\u00ea estar\u00e1 criando, lan\u00e7ando e mantendo duas bases de c\u00f3digo, em sua maioria id\u00eanticas, at\u00e9 que possa remover uma delas. A diferen\u00e7a \u00e9 que, no monoreposit\u00f3rio, essa dor \u00e9 direta e est\u00e1 \u00e0 vista. <strong>\u00c9 ainda pior, e isso \u00e9 bom.<\/strong><\/p>\n<p><\/p>\n<p>Finalmente, chegamos ao terceiro ponto. O atraso no lan\u00e7amento. Pode ser que as mudan\u00e7as feitas pela equipe A melhorem a vida da equipe A. Importante, mas n\u00e3o urgente. Podemos simplesmente atrasar? No monoreposit\u00f3rio, estamos for\u00e7ando isso para a consolida\u00e7\u00e3o do artefato. Claro, estamos falando sobre isso com a equipe D. Apenas continue na vers\u00e3o antiga at\u00e9 que voc\u00ea se atualize! Isso configura um jogo de covardes. A equipe A continua trabalhando em seu componente, ignorando o fato de que a equipe D est\u00e1 utilizando uma vers\u00e3o cada vez mais desatualizada (esse \u00e9 um problema da equipe D, eles s\u00e3o tolos). Enquanto isso, a equipe D fala mal da atitude descuidada da equipe A em rela\u00e7\u00e3o \u00e0 estabilidade do c\u00f3digo, se \u00e9 que falam sobre isso. Meses se passam. Finalmente, a equipe D decide considerar a possibilidade de uma atualiza\u00e7\u00e3o, mas as mudan\u00e7as na A s\u00f3 aumentaram. A equipe A mal se lembra de quando e como eles quebraram a D. A atualiza\u00e7\u00e3o \u00e9 mais dolorosa e levar\u00e1 mais tempo. O que a envia mais para baixo na lista de prioridades. At\u00e9 o dia em que temos um problema de seguran\u00e7a na A, que nos obriga a criar uma branch. A equipe A deve voltar no tempo, encontrar o momento em que a D estava est\u00e1vel, corrigir o problema l\u00e1 e torn\u00e1-lo pronto para o lan\u00e7amento. <strong>Esta \u00e9 uma escolha de fato que as pessoas fazem, e certamente \u00e9 a pior.<\/strong> Parece ser bom tanto para a equipe A quanto para a D, enquanto pudermos ignorar uns aos outros.<\/p>\n<p><\/p>\n<p>No monoreposit\u00f3rio, a terceira op\u00e7\u00e3o realmente n\u00e3o \u00e9 vi\u00e1vel. Voc\u00ea \u00e9 for\u00e7ado a lidar com a situa\u00e7\u00e3o de uma das duas maneiras. Voc\u00ea precisa enxergar os custos de ter duas branches de lan\u00e7amento. Aprender a se proteger contra atualiza\u00e7\u00f5es que quebram a compatibilidade. Mas o principal: <em>voc\u00ea n\u00e3o vai escapar de uma conversa dif\u00edcil.<\/em><\/p>\n<p><\/p>\n<p>Na minha experi\u00eancia, quando as equipes se tornam grandes, n\u00e3o h\u00e1 mais como manter todo o sistema na cabe\u00e7a, e essa \u00e9 a parte mais importante. Voc\u00ea deve melhorar a visibilidade das discrep\u00e2ncias no sistema. Voc\u00ea deve trabalhar ativamente para fazer as equipes desviarem o olhar de seus componentes e olharem para o trabalho de outras equipes e consumidores.<\/p>\n<p><\/p>\n<p>Sim, voc\u00ea pode criar ferramentas que tentem resolver o problema dos polirreposit\u00f3rios. Mas a minha experi\u00eancia em entrega cont\u00ednua e automa\u00e7\u00e3o em grandes empresas me diz o seguinte: o comportamento padr\u00e3o, sem o uso de ferramentas adicionais, \u00e9 aquele que voc\u00ea espera ver. <strong>O comportamento padr\u00e3o do polirreposit\u00f3rio \u00e9 a isola\u00e7\u00e3o, esse \u00e9 o foco. O comportamento padr\u00e3o do monorreposit\u00f3rio \u00e9 a responsabilidade compartilhada e a transpar\u00eancia, esse \u00e9 o cerne.<\/strong> Em ambos os casos, vou criar uma ferramenta que ajude a suavizar as arestas. Como l\u00edder, escolherei o monorreposit\u00f3rio sempre, porque as ferramentas devem fortalecer a cultura que procuro, e a cultura vem de pequenas decis\u00f5es e do trabalho di\u00e1rio da equipe.<\/p>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">Quem s\u00e3o os maiores fan\u00e1ticos? Os defensores:<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Monoreposit\u00f3rio<\/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>                    Pesquisa errada \/ ambos<\/p>\n<\/li>\n<\/ul>\n<p>    33 usu\u00e1rios votaram. 13 usu\u00e1rios se abstiveram.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47 Monorreposit\u00f3rios: por favor, \u00e9 necess\u00e1rio | ProHoster","description":"A tradu\u00e7\u00e3o do artigo foi preparada para estudantes.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/34744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}