Grande layout do projeto: adicionando novo recurso a vários subprojetos

13

Quero saber como gerenciar um grande projeto com muitos componentes com o sistema de gerenciamento de controle de versão.

No meu projeto atual, existem 4 partes principais.

  1. Rede
  2. Servidor
  3. Admin Console
  4. Plataforma.

A parte da web e do servidor usa 2 bibliotecas que escrevi. No total, existem 5 repositórios git e 1 repositório mercurial. O script de construção do projeto está no repositório da plataforma. Ele automatiza todo o processo de construção.

O problema é que, quando adiciono um novo recurso que afeta vários componentes, tenho que criar ramificação para cada repositório afetado. Implemente o recurso. Mesclar de volta. Meu pressentimento é "algo está errado".

Então, devo criar um único repositório e colocar todos os componentes lá? Acho que a ramificação será mais fácil nesse caso. Ou apenas faço o que estou fazendo agora. Nesse caso, como resolvo esse problema de criação de ramificação em cada repositório?

Shiplu Mokaddim
fonte
Você pode reorganizar sua funcionalidade para colocar o máximo possível em bibliotecas compartilhadas (gemas Ruby, ovos Python, Java beans etc.) e depois montar as partes com a idéia de "compor" cada elemento das bibliotecas?
Narfanator
Pense em quando adicionamos um novo suporte ao protocolo no componente Servidor. Também devemos adicionar controles de interação adequados (botões, campos etc.) para isso na web também.
Esse
1
Isso parece análogo ao padrão de "ponte"; você pode se inspirar nisso.
Narfanator
um repositório para governá-los todos
Steven A. Lowe

Respostas:

8

Na situação que você descreve, você não está obtendo nenhum benefício por ter vários repositórios, mas tem um custo: não pode reverter para uma versão mais antiga de um repositório e tem certeza de que seu sistema continuará funcionando. Isso ocorre porque seu código está fortemente associado aos repositórios. Como a confiança na capacidade de reverter é um dos principais benefícios do controle de origem, essa não é a situação em que você deseja estar.

A solução é definir sua estrutura de repositório com base no acoplamento do código: se o componente A do projeto compartilhar apenas interfaces estáveis ​​com o componente B do projeto, elas poderão ser colocadas em repositórios separados. Caso contrário, eles devem ser colocados no mesmo repositório. Um layout de repositório mais granular refletirá uma arquitetura de sistema fatorada melhor.

Aidan Cully
fonte
2

Se cada um de seus repositórios for projetos ou bibliotecas independentes, eu diria que não há nada inerentemente errado em precisar criar ramificações de recursos em cada repositório ao adicionar novos recursos que se cruzam entre os projetos. Por serem independentes, cada um pode ter uma versão independente e você pode descontinuar APIs antigas.

Mas no seu caso particular, parece que seus repositórios podem não estar agrupando seu código de maneira eficaz. Se as alterações no código em um repositório exigirem alterações em outros (descontinuação), seu acoplamento é muito apertado ou os repositórios devem ser reorganizados.

Se todos os repositórios são realmente parte do mesmo projeto (eles não podem ficar sozinhos), talvez você deva ter apenas 1 repositório. (Ou talvez 2: o projeto principal e outro para a funcionalidade genérica / padronizada.)

Allan
fonte