{"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\/sv\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monorepositorier: V\u00e4nligen, det \u00e4r n\u00f6dv\u00e4ndigt","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monorepositorier: V\u00e4nligen, det \u00e4r n\u00f6dv\u00e4ndigt\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>\u00d6vers\u00e4ttningen av artikeln f\u00f6rbereddes f\u00f6r studenter i kursen <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u00abDevOps metoder och verktyg\u00bb<\/a><\/noindex> i utbildningsprojektet OTUS.<\/em><\/p>\n<p>Du b\u00f6r v\u00e4lja monorepo eftersom det beteende som det fr\u00e4mjar i dina team \u00e4r transparens och kollektivt ansvar, s\u00e4rskilt n\u00e4r team v\u00e4xer. I vilket fall som helst m\u00e5ste du investera i verktyg, men det \u00e4r alltid b\u00e4ttre n\u00e4r standardbeteendet \u00e4r det beteende du vill se i dina team. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">Varf\u00f6r pratar vi om detta?<\/h1>\n<p><\/p>\n<p>Matt Klein skrev en artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u00abMonorepos: Sn\u00e4lla g\u00f6r inte s\u00e5!\u00bb<\/a><\/noindex>\u200a (\u00f6vers. anm.: \u00f6vers\u00e4ttning p\u00e5 Habr\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u00abMonorepositories: please don\u2019t\u00bb<\/a><\/noindex>). Jag gillar Matt, jag tycker att han \u00e4r mycket smart, och du b\u00f6r l\u00e4sa hans \u00e5sikt. Ursprungligen publicerade han en omr\u00f6stning p\u00e5 Twitter:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monorepositorier: V\u00e4nligen, det \u00e4r n\u00f6dv\u00e4ndigt\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>\u00d6vers\u00e4ttning:<\/em><br \/>\n<em>P\u00e5 denna ny\u00e5rsdag skulle jag argumentera f\u00f6r hur absurda monorepositorier \u00e4r. \u00c5r 2019 b\u00f6rjade obem\u00e4rkt. I den andan f\u00f6resl\u00e5r jag en omr\u00f6stning. Vem \u00e4r stora entusiaster? F\u00f6respr\u00e5kare:<\/em><br \/>\n\u2014 <em>Monorepo<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>Felaktig omr\u00f6stning \/ b\u00e5da<\/em><\/p>\n<p><\/p>\n<p>Mitt svar var: \u00abJag \u00e4r bokstavligen b\u00e5da dessa personer\u00bb. Ist\u00e4llet f\u00f6r att prata om hur Rust \u00e4r en drog, l\u00e5t oss g\u00e5 igenom varf\u00f6r jag tycker att han har fel om monorepositorier. Lite om mig sj\u00e4lv. Jag \u00e4r teknisk chef f\u00f6r Chef Software. Vi har cirka 100 ingenj\u00f6rer, en kodbas som \u00e4r omkring 11\u201312 \u00e5r gammal och 4 huvudprodukter. Del av denna kod ligger i polyrepo (min startposition), del i monorepo (min nuvarande position).<\/p>\n<p><\/p>\n<p>Innan jag b\u00f6rjar: varje argument jag tar upp h\u00e4r kommer att till\u00e4mpas p\u00e5 b\u00e5da typerna av repositorier. Enligt min mening finns det ingen teknisk anledning till varf\u00f6r du b\u00f6r v\u00e4lja den ena eller den andra typen av repository. Du kan f\u00e5 vilket tillv\u00e4gag\u00e5ngss\u00e4tt som helst att fungera. Jag \u00e4r glad att diskutera detta, men jag \u00e4r inte intresserad av konstgjorda tekniska anledningar till att det ena \u00f6verg\u00e5r det andra. <\/p>\n<p><\/p>\n<p>Jag h\u00e5ller med om den f\u00f6rsta delen av Matts synpunkt:<\/p>\n<p><\/p>\n<p><em>F\u00f6r p\u00e5 stor skala kommer ett monorepo att hantera alla de samma problemen som ett polyrepo, men samtidigt utmana dig till en starkare sammankoppling av din kod och kr\u00e4va otroliga insatser f\u00f6r att \u00f6ka skalbarheten av ditt versionskontrollsystem.<\/em><\/p>\n<p><\/p>\n<p>Oavsett om du v\u00e4ljer en monorepo eller polyrepo kommer du att st\u00e4llas inf\u00f6r samma problem. Hur sl\u00e4pper ni nya versioner? Vad \u00e4r er strategi f\u00f6r uppdateringar? Bak\u00e5tkompatibilitet? \u00d6msesidiga beroenden mellan projekt? Vilka arkitekturstilar \u00e4r acceptabla? Hur hanterar ni er bygg- och testinfrastruktur? Listan kan g\u00f6ras o\u00e4ndlig. Och ni kommer att beh\u00f6va l\u00f6sa dem alla i takt med att ni v\u00e4xer. Ingen gratis ost finns.<\/p>\n<p><\/p>\n<p>Jag tror att Matts argument liknar \u00e5sikter som delas av m\u00e5nga ingenj\u00f6rer (och chefer) som jag respekterar. Det kommer fr\u00e5n perspektivet hos en ingenj\u00f6r som arbetar med en komponent eller ett team som arbetar med en komponent. Du h\u00f6r saker som:<\/p>\n<p><\/p>\n<ul>\n<li>Koden \u00e4r otymplig \u2013 jag beh\u00f6ver inte allt det h\u00e4r skr\u00e4pet.<\/li>\n<li>Det \u00e4r sv\u00e5rare att testa eftersom jag m\u00e5ste kolla allt det h\u00e4r skr\u00e4pet som jag inte beh\u00f6ver.<\/li>\n<li>Det \u00e4r sv\u00e5rare att arbeta med externa beroenden.<\/li>\n<li>Jag beh\u00f6ver mina egna versionshanteringssystem.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sj\u00e4lvklart \u00e4r alla dessa punkter ber\u00e4ttigade. Det \u00e4r fallet i b\u00e5da scenarierna \u2013 i en polyrepo har jag mitt skr\u00e4p, f\u00f6rutom det som beh\u00f6vs f\u00f6r byggandet\u2026 Jag kan beh\u00f6va \u00e4nnu mer skr\u00e4p. S\u00e5 jag \"bara\" skapar verktyg som checkoutar hela projektet. Eller s\u00e5 skapar jag ett falskt monorepo med submoduler. Vi skulle kunna diskutera detta hela dagen. Men jag tror att Matts argument missar den grundl\u00e4ggande anledningen till varf\u00f6r jag starkt f\u00f6respr\u00e5kar monorepo:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Det fr\u00e4mjar kommunikation och visar p\u00e5 problem.<\/h1>\n<p><\/p>\n<p>N\u00e4r vi delar upp repository skapar vi de facto en koordinerings- och transparensproblematik. Det matchar hur vi t\u00e4nker p\u00e5 team (s\u00e4rskilt hur enskilda deltagare t\u00e4nker p\u00e5 dem): vi \u00e4r ansvariga f\u00f6r en viss komponent. Vi arbetar relativt isolerat. Gr\u00e4nserna fastst\u00e4lls kring mitt team och de komponenter vi arbetar med.<\/p>\n<p><\/p>\n<p>N\u00e4r arkitekturen blir mer komplex kan ett team inte l\u00e4ngre hantera den ensamt. Mycket f\u00e5 ingenj\u00f6rer har hela systemet i huvudet. Anta att du hanterar en gemensam komponent A som anv\u00e4nds av team B, C och D. Team A refaktorerar, f\u00f6rb\u00e4ttrar API:et och \u00e4ndrar den interna implementationen. Som resultat blir f\u00f6r\u00e4ndringarna bak\u00e5tkompatibla. Vilket r\u00e5d skulle du ge?<\/p>\n<p><\/p>\n<ul>\n<li>Identifiera alla platser d\u00e4r det gamla API:et anv\u00e4nds.<\/li>\n<li>Finns det platser d\u00e4r det nya API:et inte kan anv\u00e4ndas?<\/li>\n<li>Kan ni fixa och testa andra komponenter f\u00f6r att s\u00e4kerst\u00e4lla att de inte g\u00e5r s\u00f6nder?<\/li>\n<li>Kan dessa team kontrollera era f\u00f6r\u00e4ndringar just nu?<\/li>\n<\/ul>\n<p><\/p>\n<p>Observera att dessa fr\u00e5gor inte beror p\u00e5 typ av lager. Ni beh\u00f6ver hitta team B, C och D. Ni m\u00e5ste prata med dem, ta reda p\u00e5 deras tidsramar och f\u00f6rst\u00e5 deras prioriteringar. \u00c5tminstone hoppas vi att ni g\u00f6r det.<\/p>\n<p><\/p>\n<p>Ingen vill faktiskt g\u00f6ra detta. Det \u00e4r mycket mindre sp\u00e4nnande \u00e4n att bara fixa det f\u00f6rbannade API:et. Allt detta \u00e4r m\u00e4nskligt och komplicerat. I ett polerat lager kan ni helt enkelt g\u00f6ra \u00e4ndringar, ge dem f\u00f6r granskning till dem som arbetar med den h\u00e4r komponenten (f\u00f6rmodligen inte B, C eller D) och g\u00e5 vidare. Team B, C och D kan f\u00f6rbli p\u00e5 sin nuvarande version f\u00f6r tillf\u00e4llet. De kommer att uppdatera sig sj\u00e4lva n\u00e4r de inser er genialitet!<\/p>\n<p><\/p>\n<p>I ett monolager f\u00f6r\u00e4ndras ansvaret per automatik. Team A \u00e4ndrar sin komponent och om de inte \u00e4r f\u00f6rsiktiga bryter de omedelbart B, C och D. Detta leder till att B, C och D dyker upp vid d\u00f6rren hos A och undrar varf\u00f6r team A har brutit bygget. Detta l\u00e4r A att de inte kan hoppa \u00f6ver min lista ovan. De m\u00e5ste prata om vad de planerar att g\u00f6ra. Kan B, C och D g\u00e5 vidare? Vad h\u00e4nder om B och C kan, men D \u00e4r djupt kopplad till sideffekterna av det gamla algoritmens beteende?<\/p>\n<p><\/p>\n<p>Vi m\u00e5ste sedan prata om hur vi ska ta oss ur denna situation:<\/p>\n<p><\/p>\n<ol>\n<li>St\u00f6dja flera interna API:er, d\u00e4r den gamla algoritmen markeras som f\u00f6r\u00e5ldrad tills D kan sluta anv\u00e4nda den.<\/li>\n<li>St\u00f6dja flera versionsutg\u00e5vor, en med det gamla gr\u00e4nssnittet, en med det nya.<\/li>\n<li>F\u00f6rdr\u00f6ja lanseringen av f\u00f6r\u00e4ndringarna i A tills B, C och D samtidigt kan ta emot dem.<\/li>\n<\/ol>\n<p><\/p>\n<p>Anta att vi har valt 1, flera API:er. I s\u00e5 fall har vi tv\u00e5 bitar av kod. Den gamla och den nya. Ganska praktiskt i vissa situationer. Vi \u00e5terst\u00e4ller den gamla koden, markerar den som f\u00f6r\u00e5ldrad (deprecated) och samordnar en tidsplan f\u00f6r dess borttagning med team D. I praktiken \u00e4r det identiskt f\u00f6r b\u00e5de poly- och monorepo.<\/p>\n<p><\/p>\n<p>F\u00f6r att sl\u00e4ppa flera versioner beh\u00f6ver vi en gren. Nu har vi tv\u00e5 komponenter \u2013 A1 och A2. Team B och C anv\u00e4nder A2, medan D anv\u00e4nder A1. Vi beh\u00f6ver att varje komponent \u00e4r redo f\u00f6r release, f\u00f6r innan D kan g\u00e5 vidare kan s\u00e4kerhetsuppdateringar och andra buggfixar kr\u00e4vas. I poly-repon kan vi d\u00f6lja detta i en l\u00e5nglivad gren, som k\u00e4nns bra. I monorepo tvingar vi att skapa kod i en ny modul. Team D m\u00e5ste fortfarande g\u00f6ra \u00e4ndringar i den \"gamla\" komponenten. Alla kan se kostnaden vi betalar h\u00e4r \u2013 vi har nu dubbelt s\u00e5 mycket kod, och alla buggfixar som till\u00e4mpas p\u00e5 A1 och A2 m\u00e5ste till\u00e4mpas p\u00e5 b\u00e5da. Med grensystemet i poly-repo \u00e4r detta dolt bakom cherry-pick. Vi ser kostnaden som mindre, f\u00f6r d\u00e4r sker ingen duplicering. Ur praktisk synvinkel \u00e4r kostnaden densamma: du kommer att skapa, sl\u00e4ppa och underh\u00e5lla tv\u00e5 i huvudsak identiska kodbaser tills du kan ta bort en av dem. Skillnaden \u00e4r att sm\u00e4rtan i monorepo \u00e4r direkt och synlig. <strong>Det \u00e4r \u00e4nnu v\u00e4rre, och det \u00e4r bra.<\/strong><\/p>\n<p><\/p>\n<p>\u00c4ntligen har vi kommit till den tredje punkten. F\u00f6rseningen av lanseringen. Det \u00e4r m\u00f6jligt att de \u00e4ndringar som team A g\u00f6r kommer att f\u00f6rb\u00e4ttra livet f\u00f6r team A. Viktigt, men inte br\u00e5dskande. Kan vi bara f\u00f6rdr\u00f6ja det? I monorepot pushar vi detta f\u00f6r att bef\u00e4sta artefakten. Sj\u00e4lvklart pratar vi om det med team D. H\u00e5ll bara kvar vid den gamla versionen tills ni hinner ikapp! Detta s\u00e4tter tonen f\u00f6r en fegare inst\u00e4llning. Team A forts\u00e4tter att arbeta med sin komponent, och ignorerar det faktum att team D anv\u00e4nder en allt mer f\u00f6r\u00e5ldrad version (det \u00e4r team D:s problem, de \u00e4r dumma). Under tiden pratar team D negativt om team A:s nonchalanta inst\u00e4llning till kodens stabilitet, om de ens n\u00e4mner det. M\u00e5nader g\u00e5r. Till slut best\u00e4mmer sig team D f\u00f6r att se p\u00e5 m\u00f6jligheten att uppdatera, men \u00e4ndringarna i A har bara blivit fler. Team A minns knappt n\u00e4r och hur de br\u00f6t D. Uppdateringen blir mer sm\u00e4rtsam och tar l\u00e4ngre tid. Detta s\u00e4tter det l\u00e4ngre ner p\u00e5 prioriteringslistan. Tills den dagen d\u00e5 vi f\u00e5r ett s\u00e4kerhetsproblem i A som tvingar oss att g\u00f6ra en branch. Team A m\u00e5ste g\u00e5 tillbaka i tiden, hitta den punkt d\u00e5 D var stabilt, fixa problemet d\u00e4r och g\u00f6ra det redo f\u00f6r lansering. <strong>Detta \u00e4r ett de facto-val som m\u00e4nniskor g\u00f6r, och det \u00e4r definitivt det s\u00e4msta.<\/strong> Det verkar vara bra f\u00f6r b\u00e5de team A och D, s\u00e5 l\u00e4nge vi kan ignorera varandra.<\/p>\n<p><\/p>\n<p>I monorepot \u00e4r det verkligen inte ett alternativ. Du \u00e4r tvungen att hantera situationen p\u00e5 tv\u00e5 s\u00e4tt. Du beh\u00f6ver se kostnaderna f\u00f6r att ha tv\u00e5 release-grenar. L\u00e4ra dig att skydda dig mot uppdateringar som bryter bak\u00e5tkompatibiliteten. Men det viktigaste \u00e4r: <em>du kan inte undvika en sv\u00e5r konversation.<\/em><\/p>\n<p><\/p>\n<p>Enligt min erfarenhet, n\u00e4r teamen blir stora, finns det inte l\u00e4ngre m\u00f6jlighet att h\u00e5lla hela systemet i huvudet, och det \u00e4r den viktigaste delen. Du m\u00e5ste f\u00f6rb\u00e4ttra synligheten f\u00f6r mots\u00e4ttningarna i systemet. Du m\u00e5ste aktivt arbeta f\u00f6r att f\u00e5 teamen att titta bort fr\u00e5n sina komponenter och se p\u00e5 arbetet hos andra team och konsumenter.<\/p>\n<p><\/p>\n<p>Ja, du kan skapa verktyg som f\u00f6rs\u00f6ker l\u00f6sa problemet med polymorf repon. Men min erfarenhet av kontinuerlig leverans och automatisering p\u00e5 stora f\u00f6retag s\u00e4ger mig f\u00f6ljande: standardbeteendet utan att anv\u00e4nda extra verktyg \u00e4r det beteende du f\u00f6rv\u00e4ntar dig att se. <strong>Standardbeteendet f\u00f6r polymorfa repon \u00e4r isolering, det \u00e4r hela po\u00e4ngen. Standardbeteendet f\u00f6r monorepo \u00e4r gemensamt ansvar och transparens, det \u00e4r hela po\u00e4ngen.<\/strong> I b\u00e5da fallen planerar jag att skapa ett verktyg som g\u00f6r det enklare. Som ledare kommer jag alltid att v\u00e4lja monorepo, eftersom verktyg b\u00f6r st\u00e4rka den kultur jag vill ha, och kulturen kommer fr\u00e5n sm\u00e5 beslut och dagligt arbete fr\u00e5n teamet.<\/p>\n<p class=\"for_users_only_msg\">Endast registrerade anv\u00e4ndare kan delta i omr\u00f6stningen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logga in<\/a><\/noindex>, tack.<\/p>\n<h2 class=\"default-block__polling-title\">Vem \u00e4r mer fanatisk? Anh\u00e4ngare:<\/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>                    Felaktig omr\u00f6stning \/ b\u00e5da<\/p>\n<\/li>\n<\/ul>\n<p>    33 anv\u00e4ndare r\u00f6stade. 13 anv\u00e4nde sig av avh\u00e5llsamhet.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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: sn\u00e4lla, g\u00f6r det | ProHoster","description":"\u00d6vers\u00e4ttningen av artikeln \u00e4r f\u00f6rberedd f\u00f6r studenter.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/34744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}