{"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\/nl\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monorepositories: graag, dat moet.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monorepositories: graag, dat moet.\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>De vertaling van het artikel is voorbereid voor studenten van de cursus <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u00abDevOps-praktijken en -tools\u00bb<\/a><\/noindex> in het onderwijproject OTUS.<\/em><\/p>\n<p>Je zou voor een monorepository moeten kiezen, omdat het gedrag dat het in je teams bevordert transparantie en collectieve verantwoordelijkheid is, vooral bij het groeien van teams. Hoe dan ook, je zult moeten investeren in gereedschap, maar het is altijd beter wanneer het standaardgedrag is wat je wilt zien in je teams. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">Waarom praten we hierover?<\/h1>\n<p><\/p>\n<p>Matt Klein schreef een artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u00abMonorepos: alsjeblieft niet!\u00bb<\/a><\/noindex>\u200a (opmerking van de vertaler: vertaling op Habra) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u00abMonorepositories: alsjeblieft niet\u00bb<\/a><\/noindex>). Ik vind Matt leuk, ik denk dat hij erg slim is, en je moet zijn standpunt lezen. Oorspronkelijk publiceerde hij een enqu\u00eate op Twitter:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monorepositories: graag, dat moet.\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Vertaling:<\/em><br \/>\n<em>Op deze nieuwjaarsdag zal ik betogen hoe belachelijk monorepositories zijn. 2019 is onopgemerkt begonnen. In die geest bied ik je een enqu\u00eate aan. Wie zijn de grote fans? Voorstanders:<\/em><br \/>\n\u2014 <em>Monorepository<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>Incorrecte enqu\u00eate \/ beide<\/em><\/p>\n<p><\/p>\n<p>Mijn antwoord was: \u00abIk ben letterlijk beide van deze mensen\u00bb. In plaats van te praten over hoe Rust een verslaving is, laten we bespreken waarom ik denk dat hij het bij monorepositories mis heeft. Een beetje over mij. Ik ben technisch directeur bij Chef Software. We hebben ongeveer 100 ingenieurs, een codebasis van ongeveer 11\u201312 jaar oud en 4 hoofdproducten. Een deel van die code bevindt zich in een polyrepository (mijn startpositie), een deel in een monorepository (mijn huidige positie).<\/p>\n<p><\/p>\n<p>Voordat ik begin: elk argument dat ik hier aandraag, geldt voor beide soorten repositories. Naar mijn mening zijn er geen technische redenen om de ene of de andere repository te kiezen. Je kunt elke aanpak doen werken. Ik praat daar graag over, maar ik ben niet ge\u00efnteresseerd in kunstmatige technische redenen waarom de een beter zou zijn dan de ander. <\/p>\n<p><\/p>\n<p>Ik ben het eens met het eerste deel van Matts standpunt:<\/p>\n<p><\/p>\n<p><em>Omdat een monorepository op grote schaal al dezelfde problemen zal oplossen als een polyrepository, maar je tegelijkertijd uitnodigt tot sterke verbondenheid van je code en ongelooflijke inspanningen vereist om de schaalbaarheid van je versiebeheersysteem te vergroten.<\/em><\/p>\n<p><\/p>\n<p>U staat voor dezelfde problemen, of u nu voor een monorepository of een polyrepository kiest. Hoe publiceert u releases? Wat is uw aanpak voor updates? Achterwaartse compatibiliteit? Kruisafhankelijkheden tussen projecten? Welke architecturale stijlen zijn acceptabel? Hoe beheert u uw build- en testinfrastructuur? De lijst is eindeloos. En u zult ze allemaal oplossen naarmate u groeit. Er is geen gratis kaas.<\/p>\n<p><\/p>\n<p>Ik denk dat het argument van Matt vergelijkbaar is met de opvattingen die veel ingenieurs (en managers) delen die ik respecteer. Dit komt vanuit het perspectief van een ingenieur die aan een component werkt, of een team dat aan een component werkt. U hoort zaken als:<\/p>\n<p><\/p>\n<ul>\n<li>De codebase is omvangrijk \u2014 ik heb al die rommel niet nodig.<\/li>\n<li>Het is moeilijker te testen, omdat ik al die rommel moet controleren die ik niet nodig heb.<\/li>\n<li>Het is moeilijker om met externe afhankelijkheden te werken.<\/li>\n<li>Ik heb mijn eigen virtuele versiebeheersystemen nodig.<\/li>\n<\/ul>\n<p><\/p>\n<p>Zeker, al deze punten zijn gerechtvaardigd. Dit geldt in beide gevallen \u2014 in een polyrepository heb ik mijn rommel, naast wat nodig is voor de build... Ik heb mogelijk nog meer rommel nodig. Daarom cre\u00eber ik \"simpelweg\" tools die de hele projectcheckout uitvoeren. Of ik maak een nep monorepository met submodules. We zouden hier de hele dag omheen kunnen draaien. Maar ik denk dat het argument van Matt de belangrijkste reden overslaat die ik sterk heb omgedraaid in het voordeel van een monorepository:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Het stimuleert communicatie en laat problemen zien.<\/h1>\n<p><\/p>\n<p>Wanneer we repositories scheiden, cre\u00ebren we de facto een probleem van co\u00f6rdinatie en transparantie. Dit komt overeen met hoe we over teams denken (vooral hoe individuele leden over hen denken): we zijn verantwoordelijk voor een bepaalde component. We werken in relatieve isolatie. De grenzen zijn vastgesteld op mijn team en de component(-en) waaraan we werken.<\/p>\n<p><\/p>\n<p>Bij het complexer maken van de architectuur kan \u00e9\u00e9n team het niet langer alleen beheren. Heel weinig ingenieurs houden het volledige systeem in hun hoofd. Stel dat u een gemeenschappelijk component A beheert dat door teams B, C en D wordt gebruikt. Team A voert refactoring uit, verbetert de API en wijzigt de interne implementatie. Hierdoor zijn de wijzigingen niet meer compatibel met eerdere versies. Welk advies zou u geven?<\/p>\n<p><\/p>\n<ul>\n<li>Vind alle plekken waar de oude API wordt gebruikt.<\/li>\n<li>Zijn er plekken waar de nieuwe API niet kan worden gebruikt?<\/li>\n<li>Kunt u andere componenten aanpassen en testen om er zeker van te zijn dat ze niet kapot gaan?<\/li>\n<li>Kunnen deze teams uw wijzigingen nu controleren?<\/li>\n<\/ul>\n<p><\/p>\n<p>Houd er rekening mee dat deze vragen niet afhankelijk zijn van het type repository. U moet teams B, C en D vinden. U moet met hen praten, hun tijdlijn begrijpen en hun prioriteiten leren kennen. Tenminste, we hopen dat u dat doet.<\/p>\n<p><\/p>\n<p>Eigenlijk wil niemand zich hiermee bezighouden. Het is veel minder spannend dan gewoon die verdomde API te repareren. Dit is allemaal menselijk en ingewikkeld. In een polirepository kunt u eenvoudig wijzigingen aanbrengen, deze ter beoordeling geven aan degenen die aan die component werken (waarschijnlijk niet B, C of D) en verder gaan. Teams B, C en D kunnen voorlopig gewoon op hun huidige versie blijven. Ze zullen bijwerken zodra ze uw genialiteit beseffen!<\/p>\n<p><\/p>\n<p>In een monorepository verschuift de verantwoordelijkheid standaard. Team A wijzigt zijn component en, als ze niet voorzichtig zijn, breken ze onmiddellijk B, C en D. Dit zorgt ervoor dat B, C en D aan de deur van A verschijnen, zich afvragend waarom team A de build heeft gebroken. Dit leert A dat ze mijn bovenstaande lijst niet kunnen negeren. Ze moeten praten over wat ze van plan zijn te doen. Kunnen B, C en D vooruit? Wat als B en C dat kunnen, maar D nauw verbonden is met het bijeffect van het gedrag van het oude algoritme?<\/p>\n<p><\/p>\n<p>Dan moeten we praten over hoe we uit deze situatie komen:<\/p>\n<p><\/p>\n<ol>\n<li>Ondersteuning voor meerdere interne API's, waarbij het oude algoritme als verouderd wordt gemarkeerd totdat D het niet meer kan gebruiken.<\/li>\n<li>Ondersteuning voor meerdere versies van releases, \u00e9\u00e9n met de oude interface, \u00e9\u00e9n met de nieuwe.<\/li>\n<li>Uitgestelde release van wijzigingen A totdat B, C en D tegelijkertijd deze kunnen accepteren.<\/li>\n<\/ol>\n<p><\/p>\n<p>Stel dat we 1 kiezen, verschillende API's. In dit geval hebben we twee stukken code. Een oude en een nieuwe. Dit is in sommige situaties behoorlijk handig. We zetten de oude code terug, markeren deze als verouderd (deprecated) en stemmen de planning voor de verwijdering ervan af met team D. In wezen is dit identiek voor poly en mono-repositories.<\/p>\n<p><\/p>\n<p>Voor de release van verschillende versies hebben we een branch nodig. Nu hebben we twee componenten - A1 en A2. Teams B en C gebruiken A2, terwijl D A1 gebruikt. We moeten ervoor zorgen dat elk component release-klaar is, want voordat D verder kan, kunnen er beveiligingsupdates en andere bugfixes nodig zijn. In de poly-repository kunnen we dit verbergen in een langlevende branch, wat goed aanvoelt. In de mono-repository forceren we een code creatie in een nieuwe module. Team D zal nog steeds wijzigingen moeten aanbrengen in de 'oude' component. Iedereen kan de kosten zien die we hier dragen - we hebben nu tweemaal zoveel code, en eventuele bugfixes die op A1 en A2 worden toegepast, moeten voor hen beiden worden toegepast. Met de takkenbenadering in de poly-repository is dit verborgen achter cherry-pick. We beschouwen de kosten als lager, omdat er geen duplicatie is. Vanuit praktisch oogpunt zijn de kosten hetzelfde: je zult twee in wezen identieke codebases bouwen, uitbrengen en onderhouden totdat je er een kunt verwijderen. Het verschil is dat deze pijn in de mono-repository direct en in het zicht is. <strong>Dit is nog erger, en dat is goed.<\/strong><\/p>\n<p><\/p>\n<p>Eindelijk zijn we aangekomen bij het derde punt: de uitstel van de release. Het kan zijn dat de wijzigingen aangebracht door A het leven van team A verbeteren. Belangrijk, maar niet urgent. Kunnen we het gewoon uitstellen? In de monorepo duwen we dit om het artefact vast te leggen. Natuurlijk spreken we hierover met team D. Blijf gewoon op de oude versie totdat je bij bent! Dit cre\u00ebert een situatie van angst. Team A blijft werken aan hun component, zonder rekening te houden met het feit dat team D een steeds verouderde versie gebruikt (dat is het probleem van team D, ze zijn dom). Ondertussen praat team D slecht over de onvoorzichtige houding van team A ten aanzien van de stabiliteit van de code, als ze er \u00fcberhaupt over praten. Maanden verstrijken. Uiteindelijk besluit team D om te bekijken of een update mogelijk is, maar de wijzigingen in A zijn alleen maar toegenomen. Team A herinnert zich nauwelijks wanneer en hoe ze D hebben gebroken. Het updaten is nu pijnlijker en zal meer tijd kosten. Wat het verder naar beneden duwt op de prioriteitenlijst. Tot de dag dat we een beveiligingsprobleem in A tegenkomen, wat ons dwingt om een branch te maken. Team A moet terug in de tijd reizen, het moment vinden waarop D stabiel was, het probleem daar oplossen en het klaar maken voor release. <strong>Dit is de facto de keuze die mensen maken, en het is zeker de slechtste.<\/strong> Het lijkt goed te zijn voor zowel team A als D, zolang we elkaar kunnen negeren.<\/p>\n<p><\/p>\n<p>In de monorepo is de derde echt geen optie. Je moet omgaan met de situatie op een van de twee manieren. Je moet de kosten zien van het hebben van twee release branches. Leren jezelf te beschermen tegen updates die de achterwaartse compatibiliteit breken. Maar het belangrijkste: <em>je kunt de moeilijke conversatie niet vermijden.<\/em><\/p>\n<p><\/p>\n<p>Uit mijn ervaring, wanneer teams groter worden, is het niet meer mogelijk om het hele systeem in gedachten te houden, en dat is het belangrijkste. Je moet de zichtbaarheid van meningsverschillen in het systeem verbeteren. Je moet actief werken om teams te helpen hun aandacht van hun componenten af te halen en te kijken naar het werk van andere teams en de consumenten.<\/p>\n<p><\/p>\n<p>Ja, je kunt tools cre\u00ebren die proberen het probleem van poly-repositories op te lossen. Maar mijn ervaring met continue levering en automatisering in grote ondernemingen vertelt me het volgende: het standaardgedrag zonder extra tools is het gedrag dat je verwacht te zien. <strong>Het standaardgedrag van een poly-repository is isolatie, dat is de essentie. Het standaardgedrag van een monorepository is gedeelde verantwoordelijkheid en transparantie, dat is de essentie.<\/strong> In beide gevallen ben ik van plan een tool te cre\u00ebren die de scherpe hoeken verzacht. Als leider zal ik elke keer voor een monorepository kiezen, omdat tools de cultuur moeten versterken die ik wil, en cultuur komt voort uit kleine beslissingen en het dagelijkse werk van het team.<\/p>\n<p class=\"for_users_only_msg\">Alleen geregistreerde gebruikers kunnen deelnemen aan de enqu\u00eate. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log in<\/a><\/noindex>, alstublieft.<\/p>\n<h2 class=\"default-block__polling-title\">Wie zijn de grotere fanatici? Voorstanders:<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Monorepository<\/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>                    Incorrecte enqu\u00eate \/ beide<\/p>\n<\/li>\n<\/ul>\n<p>    33 gebruikers stemden. 13 gebruikers onthielden zich.<br \/>\n<br \/>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Monorepositories: alsjeblieft, dat moet | ProHoster","description":"De vertaling van het artikel is voorbereid voor studenten.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/34744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}