Número 49
5 de abril de 2023
|
Na hora de organizar un sistema de control de versións a pregunta de moda é: “monorrepositorio ou multirrepositorio?”. É dicir: poñemos todos os proxectos nun só repositorio de control de versións, ou dividímolos e poñemos un proxecto en cadanseu repositorio?
Na miña opinión, a maioría dos lectores da Folla debería usar un monorrepositorio. O motivo é simple: os multirrepositorios teñen moitas desvantaxes respecto dos monorrepositorios, pero case todos os inconvenientes que se lle achacan aos monorrepositorios tamén os teñen os multirrepositorios, porque eses inconvenientes non son problemas técnicos, senón organizativos.
Imaxinade o caso dun proxecto grande con varias partes ben diferenciadas: backend en Java, frontend web en Typescript, cliente Android en Kotlin e cliente iOS en Swift. É moi habitual querer poñer cada parte nun repositorio diferente. Desta maneira, os programadores que traballan nunha parte non teñen que descargar o código das outras partes nas que non traballan.
Bo era.
Este beneficio non existe. As partes nas que se divide un proxecto case nunca son totalmente independentes, así que a separación entre os distintos repositorios non é hermética. Por exemplo, é seguro que o backend e os frontends comparten os ficheiros que definen os modelos de datos. Ademais, engadir unha nova funcionalidade normalmente precisa de cambios no backend e en todos os frontends. Polo tanto, no final, case todos os programadores van precisar de ter acceso a case todos os repositorios.
Outro problema propio dos multirrepositorios é que non son atómicos.
Nun sistema de control de versións moderno, se alguén fixo un cambio que afectaba a cincuenta ficheiros, non é posible descargar unha versión incompleta dese cambio: o cambio aparece completo ou non aparece. Ou sexa, é atómico.
Nun multirrepositorio, os cambios son atómicos dentro de cada repositorio, pero non son atómicos no conxunto dos repositorios. Se alguén fixo un cambio no backend e no frontend ao mesmo tempo, é trivial descargar unha versión incompleta na que só figuran os cambios feitos nun só repositorio.
Isto parece unha parvada pero fai que, por exemplo, os sistemas de integración continua non sexan confiables nun multirrepositorio. Nun monorrepositorio podemos estar seguros de que, se hai erros na integración continua, é porque o código contén erros. Nun multirrepositorio, os erros poden estar causados porque a integración continua tratou de compilar unha mestura de versións distintas procedentes de distintos repositorios.
Hai xente que pensa que é máis doado facer control de acceso nun multirrepositorio. Se Pepe só traballa no frontend, abondaría con lle dar acceso ao repositorio do frontend; se Maruxa traballa no cliente de iOS, abondaría con lle dar acceso ao repositorio de iOS. Isto non funciona porque, como xa expliquei, Pepe e Maruxa case sempre van precisar de acceso a varios repositorios, non só ao “seu”. Polo tanto, é necesario outro mecanismo de control de acceso — que, casualmente, vai ser exactamente o mesmo mecanismo do que se precisa nun monorrepositorio, así que a avantaxe non existe.
Un caso no que un monorrepositorio pode ser inferior a un multirrepositorio é cando este monorrepositorio contén moitos gigabytes de información. Daquela é posible que as ferramentas habituais non funcionen cun repositorio tan grande — ou, incluso, que non caiba nun ordenador normal, e é preciso utilizar cousas como sistemas de ficheiros virtuais, buscadores, sistemas de compilación distribuídos e outras ferramentas polo estilo.
Pero deixádeme que vos diga unha cousa: a maioría dos lectores da Folla non ides ter este problema. Usade un monorrepositorio sen medo e xa pensaredes nalgo se algún día chegades a ese punto.
A ilustración desta Folla procede dunha postal da “Detroit Creamery Certified Milk Farm”.
Anterior: “Control de versións” | Índice | Seguinte: “Os revisores do código” |
1 comentario