{"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\/it\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monorepository: per favore, \u00e8 necessario","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monorepository: per favore, \u00e8 necessario\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>La traduzione dell'articolo \u00e8 stata preparata per gli studenti del corso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u00abPratiche e strumenti DevOps\u00bb<\/a><\/noindex> nel progetto educativo OTUS.<\/em><\/p>\n<p>Dovresti scegliere un monorepo, poich\u00e9 il comportamento che promuove nei tuoi team \u00e8 la trasparenza e la responsabilit\u00e0 collettiva, soprattutto con la crescita dei team. In ogni caso, dovrai investire negli strumenti, ma \u00e8 sempre meglio quando il comportamento predefinito \u00e8 quello che desideri vedere nei tuoi team. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">Perch\u00e9 ne parliamo?<\/h1>\n<p><\/p>\n<p>Matt Klein ha scritto un articolo <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u00abMonorepos: Per favore, non farlo!\u00bb<\/a><\/noindex>\u200a (nota del traduttore: traduzione su Habr <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u00abMonorepository: per favore non farlo\u00bb<\/a><\/noindex>). Mi piace Matt, penso che sia molto intelligente, e dovresti leggere il suo punto di vista. Inizialmente ha pubblicato un sondaggio su Twitter:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monorepository: per favore, \u00e8 necessario\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Traduzione:<\/em><br \/>\n<em>In questo giorno di Capodanno, discuter\u00f2 di quanto siano ridicoli i monorepos. Il 2019 \u00e8 iniziato senza clamore. In questo spirito, ti propongo un sondaggio. Chi sono i grandi fan? Sostenitori:<\/em><br \/>\n\u2014 <em>Monorepo<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>Sondaggio errato \/ entrambi<\/em><\/p>\n<p><\/p>\n<p>La mia risposta \u00e8 stata: \u00abIo ho letteralmente entrambe queste persone\u00bb. Invece di parlare di quanto sia tossico Rust, vediamo perch\u00e9 penso che si sbagli sui monorepository. Un po' su di me. Sono il Chief Technology Officer di Chef Software. Abbiamo circa 100 ingegneri, una base di codice che ha circa 11-12 anni e 4 prodotti principali. Parte di questo codice si trova in un monorepo (la mia posizione iniziale), parte in un polirepo (la mia posizione attuale).<\/p>\n<p><\/p>\n<p>Prima di iniziare: ogni argomento che presento qui sar\u00e0 applicabile a entrambi i tipi di repository. A mio avviso, non ci sono motivi tecnici per cui dovreste scegliere l'uno o l'altro tipo di repository. Potrete far funzionare qualsiasi approccio. Sono felice di discuterne, ma non mi interessano motivazioni tecniche artificiali per cui uno sarebbe superiore all'altro. <\/p>\n<p><\/p>\n<p>Sono d'accordo con la prima parte del punto di vista di Matt:<\/p>\n<p><\/p>\n<p><em>Perch\u00e9 su larga scala, un monorepo affronter\u00e0 gli stessi problemi che affronta un polirepo, ma ti porter\u00e0 a una forte coesione del codice e richieder\u00e0 uno sforzo straordinario per aumentare la scalabilit\u00e0 del tuo sistema di controllo delle versioni.<\/em><\/p>\n<p><\/p>\n<p>Dovrai affrontare gli stessi problemi indipendentemente dal fatto che tu scelga un monorepo o un polirepo. Come gestisci i rilasci? Qual \u00e8 il tuo approccio agli aggiornamenti? Retrocompatibilit\u00e0? Dipendenze incrociate tra progetti? Quali stili architetturali sono accettabili? Come gestisci la tua infrastruttura di build e testing? L'elenco \u00e8 infinito. E affronterai tutto questo mentre cresci. Non esiste un formaggio gratuito.<\/p>\n<p><\/p>\n<p>Penso che l'argomento di Matt sia simile alle opinioni condivise da molti ingegneri (e manager) che rispetto. Proviene dalla prospettiva di un ingegnere che lavora su un componente, o di un team che lavora su un componente. Sentirai cose come:<\/p>\n<p><\/p>\n<ul>\n<li>Il codice \u00e8 ingombrante \u2014 non ho bisogno di tutto questo ciarpame.<\/li>\n<li>\u00c8 pi\u00f9 complicato da testare, perch\u00e9 devo controllare tutto questo materiale che non mi serve.<\/li>\n<li>\u00c8 pi\u00f9 difficile lavorare con dipendenze esterne.<\/li>\n<li>Ho bisogno dei miei sistemi di versioning virtuali.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sicuramente, tutti questi punti sono validi. Accade in entrambi i casi: nel mio polirepo ho il mio materiale, oltre a quello necessario per la build\u2026 Potrei aver bisogno anche di altro materiale. Quindi, \"semplicemente\" creo strumenti che effettuano il checkout dell'intero progetto. Oppure creo un falso monorepo con sottoggetti. Potremmo discutere di questo tutto il giorno. Ma penso che l'argomento di Matt trascuri la causa principale, che ho abbastanza fortemente ribaltato a favore del monorepo:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Provoca comunicazione e mette in mostra i problemi<\/h1>\n<p><\/p>\n<p>Quando separiamo i repository, di fatto creiamo un problema di coordinazione e trasparenza. Questo si allinea con il nostro modo di pensare ai team (soprattutto come i singoli membri li percepiscono): siamo responsabili di un determinato componente. Lavoriamo in relativa isolamento. I confini sono fissati sul mio team e sul\/i componente\/i su cui stiamo lavorando.<\/p>\n<p><\/p>\n<p>Con l'aumentare della complessit\u00e0 dell'architettura, un singolo team non pu\u00f2 pi\u00f9 gestirla da solo. Pochissimi ingegneri riescono a tenere a mente l'intero sistema. Supponiamo che tu stia gestendo un componente comune A, utilizzato dai team B, C e D. Il team A sta effettuando un refactoring, migliorando l'API e modificando anche l'implementazione interna. Di conseguenza, le modifiche non sono retrocompatibili. Quale consiglio daresti?<\/p>\n<p><\/p>\n<ul>\n<li>Trova tutti i luoghi in cui viene utilizzata la vecchia API.<\/li>\n<li>Ci sono luoghi in cui la nuova API non pu\u00f2 essere utilizzata?<\/li>\n<li>Puoi correggere e testare altri componenti per assicurarti che non si rompano?<\/li>\n<li>Possono questi team verificare le tue modifiche proprio ora?<\/li>\n<\/ul>\n<p><\/p>\n<p>Si prega di notare che queste domande non dipendono dal tipo di repository. Dovrete trovare i team B, C e D. Dovrete parlare con loro, capire i tempi e le priorit\u00e0. Almeno speriamo che lo farete.<\/p>\n<p><\/p>\n<p>In realt\u00e0, a nessuno piace farlo. \u00c8 molto meno interessante che semplicemente correggere un dannato API. Tutto questo \u00e8 umano e complicato. Nel polirepository potrete semplicemente apportare modifiche, sottoporle a revisione a chi lavora su quel componente (probabilmente non B, C o D) e andare avanti. I team B, C e D possono rimanere alla loro attuale versione nel frattempo. Si aggiorneranno quando realizzeranno il vostro genio!<\/p>\n<p><\/p>\n<p>Nel monorepository la responsabilit\u00e0 del cambiamento si sposta per impostazione predefinita. Il team A modifica il proprio componente e, se non fa attenzione, danneggia immediatamente B, C e D. Questo porta B, C e D a bussare alla porta di A, chiedendosi perch\u00e9 il team A abbia rotto la build. Questo insegna a A che non possono trascurare la mia lista sopra. Devono discutere ci\u00f2 che intendono fare. Possono B, C e D procedere? E se B e C possono, ma D fosse strettamente legato all'effetto collaterale del comportamento del vecchio algoritmo?<\/p>\n<p><\/p>\n<p>Dobbiamo poi parlare di come uscirne:<\/p>\n<p><\/p>\n<ol>\n<li>Supporto per molteplici API interne, con il vecchio algoritmo contrassegnato come obsoleto, finch\u00e9 D non sar\u00e0 in grado di cessarne l'uso.<\/li>\n<li>Supporto per pi\u00f9 versioni delle release, una con la vecchia interfaccia e una con la nuova.<\/li>\n<li>Ritardare il rilascio delle modifiche A finch\u00e9 B, C e D non saranno tutti in grado di accettarle.<\/li>\n<\/ol>\n<p><\/p>\n<p>Supponiamo di aver scelto 1 o pi\u00f9 API. In questo caso abbiamo due pezzi di codice: il vecchio e il nuovo. \u00c8 piuttosto comodo in alcune situazioni. Rimandiamo il codice vecchio, lo contrassegniamo come obsoleto (deprecated) e concordiamo un piano per la sua rimozione con il team D. Essenzialmente \u00e8 identico per i repository polifilari e monorepo.<\/p>\n<p><\/p>\n<p>Per rilasciare pi\u00f9 versioni abbiamo bisogno di un ramo. Ora abbiamo due componenti: A1 e A2. I team B e C utilizzano A2, mentre D utilizza A1. \u00c8 necessario che ogni componente sia pronto per il rilascio, poich\u00e9 prima che D possa procedere, potrebbero essere necessari aggiornamenti di sicurezza e correzioni di bug. Nella polirepository possiamo nascondere questo in un ramo a lungo termine che funziona bene. Nella monorepository forziamo la creazione del codice in un nuovo modulo. Il team D dovr\u00e0 ancora apportare modifiche al componente 'vecchio'. Ognuno pu\u00f2 vedere il costo che stiamo pagando qui: abbiamo ora il doppio del codice e qualsiasi correzione di bug applicata a A1 e A2 deve essere applicata a entrambi. Con l'approccio all'uso dei rami nella polirepository, ci\u00f2 \u00e8 nascosto tramite cherry-pick. Riteniamo che il costo sia inferiore perch\u00e9 non ci sono duplicazioni. Da un punto di vista pratico, il costo \u00e8 lo stesso: dovrai costruire, rilasciare e mantenere due basi di codice sostanzialmente identiche fino a quando non potrai eliminarne una. La differenza \u00e8 che nella monorepository questo dolore \u00e8 diretto e in vista. <strong>\u00c8 ancora peggio, ed \u00e8 un bene.<\/strong><\/p>\n<p><\/p>\n<p>Finalmente, siamo arrivati al terzo punto. Ritardo nel rilascio. Potrebbe essere che le modifiche apportate da A miglioreranno la situazione del team A. Importante, ma non urgente. Possiamo semplicemente ritardare? Nel polirepository stiamo spingendo per consolidare l'artefatto. Certo, stiamo parlando di questo con il team D. Rimanete semplicemente sulla vecchia versione, finch\u00e9 non recuperate! Questo innesca una partita a essere vigliacchi. Il team A continua a lavorare sul proprio componente, ignorando il fatto che il team D sta utilizzando una versione sempre pi\u00f9 obsoleta (\u00e8 un problema del team D, sono stupidi). Nel frattempo, il team D parla male della negligenza del team A riguardo alla stabilit\u00e0 del codice, se ne parla addirittura. Passano mesi. Finalmente, il team D decide di esplorare la possibilit\u00e0 di un aggiornamento, ma i cambiamenti in A sono solo aumentati. Il team A ricorda a malapena quando e come hanno rotto D. L'aggiornamento \u00e8 pi\u00f9 doloroso e richieder\u00e0 pi\u00f9 tempo. Questo lo fa scivolare ulteriormente verso il basso nella lista delle priorit\u00e0. Fino al giorno in cui abbiamo un problema di sicurezza in A, che ci costringe a fare un branch. Il team A deve tornare indietro nel tempo, trovare il momento in cui D era stabile, risolvere il problema l\u00ec e renderlo pronto per il rilascio. <strong>Questa \u00e8 di fatto la scelta che fanno le persone, e sicuramente \u00e8 la peggiore.<\/strong> Sembra che questo vada bene sia per il team A che per il D, finch\u00e9 possiamo ignorarci a vicenda.<\/p>\n<p><\/p>\n<p>In un monorepo, il terzo non \u00e8 davvero un'opzione. Devi affrontare la situazione in uno dei due modi. Devi considerare i costi derivanti dall'avere due rami di rilascio. Imparare a proteggerti dagli aggiornamenti che rompono la retrocompatibilit\u00e0. Ma la cosa principale \u00e8: <em>non puoi evitare una conversazione difficile.<\/em><\/p>\n<p><\/p>\n<p>Per la mia esperienza, quando i team diventano grandi, non c'\u00e8 pi\u00f9 la possibilit\u00e0 di tenere in mente l'intero sistema, e questa \u00e8 la parte pi\u00f9 importante. Devi migliorare la visibilit\u00e0 delle discrepanze nel sistema. Devi lavorare attivamente per far s\u00ec che i team distolgano lo sguardo dai propri componenti e guardino il lavoro degli altri team e dei loro consumatori.<\/p>\n<p><\/p>\n<p>S\u00ec, puoi creare strumenti che cercheranno di risolvere il problema dei polirepository. Ma la mia esperienza nell'apprendimento della continuous delivery e nell'automazione in grandi aziende mi dice questo: il comportamento predefinito senza l'uso di strumenti aggiuntivi \u00e8 quello che ti aspetti di vedere. <strong>Il comportamento predefinito di un polirepository \u00e8 l'isolamento, e questo \u00e8 il punto. Il comportamento predefinito di un monorepository \u00e8 la responsabilit\u00e0 condivisa e la trasparenza, e questo \u00e8 il punto.<\/strong> In entrambi i casi, intendo creare uno strumento che aiuti a smussare gli angoli. Come manager, scelgo sempre il monorepository perch\u00e9 gli strumenti devono rafforzare la cultura che desidero, e la cultura nasce da piccole decisioni e dal lavoro quotidiano del team.<\/p>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Chi sono i fanatichi pi\u00f9 accaniti? Sostenitori:<\/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>                    Sondaggio errato \/ entrambi<\/p>\n<\/li>\n<\/ul>\n<p>    Hanno votato 33 utenti. 13 utenti hanno scelto di astenersi.<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 4.9.10 - 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 \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,\" \/>\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\/it\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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 \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,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Monorepo: assolutamente necessario | ProHoster","description":"La traduzione dell'articolo \u00e8 stata preparata per gli studenti del corso \"Pratiche e strumenti DevOps\" nel progetto educativo OTUS. Dovete scegliere un monorepo, poich\u00e9 il comportamento che promuove all'interno dei vostri team \u00e8 la trasparenza e la responsabilit\u00e0 collettiva, soprattutto con l'aumentare delle dimensioni dei team. In ogni caso, \u00e8 necessario investire negli strumenti, ma \u00e8 sempre meglio quando il comportamento di default \u00e8 questo comportamento.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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 \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,","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}