Estou tentando reunir maneiras eficazes pelas quais outras pessoas resolveram o seguinte problema. No trabalho, fomos forçados a lançar um patch de software (a ser instalado nos sistemas do usuário final) que queremos apenas visível para um cliente específico. O código personalizado está em sua própria ramificação de controle de origem. O problema é que temos duas linhas de código paralelas (e construímos scripts) para mantermos sincronizadas, e toda vez que corrigimos o código original, precisamos corrigir e testar o código específico do cliente.
Estou curioso, como outras organizações lidam com esse cenário? Estamos abertos a soluções de negócios e não apenas técnicas (relacionadas ao controle de fonte). Por exemplo, falamos em dizer ao cliente que ele não pode receber atualizações nessa filial.
Nossa estratégia de ramificação é assim (com base no Guia de ramificação do Visual Studio TFS , embora estejamos usando o Subversion)
hg
ougit
posso sugerir que você use Filas de Correção ( Mercurial Queues Extension ou Stacked Git ), mas não sei se o TFS tem algo semelhante.svn
meios para que eles não atrapalhem seu fluxo de trabalho normal. Se as Filas de Patch parecerem úteis, você poderá testá-las usando git-svn ou hgsubversion . O uso de um front end do DVCS para suavizar um fluxo de trabalho complicadosvn
pode até encorajar as pessoas a considerar mudar para um atacado DVCS, para obter todos os outros benefícios.Respostas:
Quando você começa a distribuir patches específicos do cliente, criou imediatamente uma nova versão do seu produto que deve ser mantida ao lado dele. Isso significa que as mudanças precisam ser propagadas entre as duas versões. Normalmente, as correções específicas do cliente são personalizações que devem pertencer ao cliente, incluindo o código-fonte.
Parece improvável que um patch para corrigir algo não consiga entrar na ramificação da linha principal, a menos que seja uma correção temporária abaixo do ideal para um problema imediato. Se for esse o caso, o patch precisará ser mantido apenas até que a correção esperada chegue à linha principal.
fonte
Parece-me que a chave é "visível" - que tal não ter uma ramificação de código separada, mas uma opção de configuração que altera o comportamento?
fonte
Você vê isso como algo de curto ou longo prazo? O fato é que a empresa já decidiu acomodar esse cliente tão rapidamente que já é uma decisão comercial a ser resolvida principalmente pelas práticas de negócios (aceitando o custo extra / cobrando ao cliente pelo custo).
Se a longo prazo, você provavelmente obterá economia se refazer o software para acomodar facilmente as necessidades dos clientes por meio de configuração (ou instalação, etc.).
Se for relativamente curto prazo, significa que em breve você mesclará essas mudanças novamente no ramo principal / de desenvolvimento e todos os usuários também verão as alterações, provavelmente será aceitável trabalhar dentro das limitações da sua situação atual. Como eu disse, a decisão do que fazer deveria ter sido tomada quando a decisão de acomodar o cliente foi tomada.
Longa história curta. A longo prazo, conserte tecnicamente, a curto prazo, trate disso.
Claro que há um ponto em que é um sorteio. Se você estiver nesse ponto, eu faria o que os desenvolvedores preferirem.
fonte
Também usamos o subversion - e encontramos exatamente esse cenário.
Aqui estão alguns pontos-chave a serem lembrados:
Embora seja necessário evitar filiais específicas para os clientes, a necessidade deve ser minimizada quanto possível; sempre pergunte se é possível generalizar a solução que pode funcionar para todos.
As filiais específicas do cliente devem se originar de uma nova versão. Suponha que você tenha uma versão 1.2 e que tenha derivado da versão 1.2.1 até 1.2.11 - as filiais do cliente devem receber todos os patches, portanto, a filial do cliente deve permanecer compatível com a versão principal.
É necessário criar uma filial específica do cliente quando você inicia uma nova versão não compatível. A parte infeliz é que, de alguma forma, você pode precisar refazer o trabalho. Uma solução pode ser a criação de todos os patches das filiais do cliente, que precisam ser extraídos e o que for compatível ainda pode ser aplicado à nova filial do cliente.
Sempre, em nenhuma circunstância, você deve enviar alterações específicas do cliente de volta para liberar filial ou tronco. No entanto, idealmente, deve-se tentar generalizar o trabalho de forma que esse trabalho específico do cliente seja reduzido.
Tentei juntar essas idéias para mostrar :
fonte
Que tal introduzir um mecanismo de extensão no seu código?
Seu código principal possui:
Quando o programa é iniciado, ele procura DLL / equivalente moral, em sua pasta de inicialização, para personalizações locais. Se encontrar um, ele carrega e pode conter a versão específica da empresa do Foo
O FooForABC implementa o mesmo comportamento do Foo, mas substitui as funções necessárias para fornecer o comportamento específico que o ABC precisa. A técnica deve ser flexível o suficiente para lidar com qualquer cenário que você precise oferecer suporte.
fonte