( enpassant | 2017. 05. 29., h - 08:52 )

Kényelmesnek tűnik, de nem az, ráadásul pont a Continuous Delivery -t lehetetleníti el.

Tegyük fel, hogy van egy A komponensed, amitől függ a B, C, D komponens.
A komponensen API változtatást végzel egy branch-ben, emiatt nem fog fordulni a B, C, D komponensed sem ugyanabban a branchben. Milyen jónak tűnik!
A gond akkor kezdődik, ha a B komponensnél szeretnéd ezt a változást minél gyorsabban lekezelni és kiküldeni (delivery) az új B komponens-t, legyen ez 2 nap. Csakhogy ezt nem tudják megtenni, amíg a C, D komponensekben is át nem vezetik a változást. A C komponensben éppen egy sürgős funkciót raknak, amit egy hét múlva kellene küldeniük.
Ilyenkor az a helyzet áll elő, hogy vagy a C komponens készítők abbahagyják a munkájukat és átvezetik az A változásait 2 nap alatt, hogy kimehessen a B, de akkor két napot csúsznak, vagy megcsinálják a saját funkciójukat, majd aztán vezetik át a változásokat, akkor meg a B fog csúszni egy hetet.

Egy gigászi monorepóban mérhetetlen sok ilyen függőség lesz. Egyik komponens változása magával ragad egy csomó másik komponenst, egyik vár a másikra, majd fél évente, ha minden lecsitul, akkor ki lehet adni minden komponensből egy verziót, ami ezer módosítást tartalmaz.

Ezzel szemben, ha szépen el vannak szeparálva az egyes komponensek, akkor az A változása nincs hatása senkire, akár egyből lehet küldeni. B, az új A alapján átvezetheti a változásait, majd tesztek és build után mehet azonnal ki. Ha bármi probléma van, akkor lehet tudni, hogy mivel van, hiszen csak nagyon kicsi változások után mennek ki az új verziók. Emellett C, D komponensek is élik a saját életüket, nincsenek egymással összekötve. Pl. a B2.4 az A1.3-at használja, majd a B2.5-ben az A2.0-ra állnak át. Semmi más változtatás nincs, mehet ki. Miközben C3.5 már az A1.7-et használja, de az A2.x-re váltás még nem sürgős nekik, előbb a saját szolgáltatásaikon fejlesztenének.

A munka is kevesebb lesz összességében, hiszen A minden egyes változását nem kell átvezetni a B, C, D-n minden egyes alkalommal, nem kell új teszteket írni, a meglevőket futtatni, kézzel tesztelni, kiküldeni. Egy-egy változtatás, mint tudjuk, hibalehetőségeket rejt magában, így az összes tőle függő komponenst (nem csak a közvetlen függőeket) érintheti.

A munka is könnyebb a szeparált esetben, mivel az A komponensnél nem lesznek ott a B, C, D komponens branch-ei, csak a sajátjai.